-> 추가적인 기능 구현을 생각하지 않고 스크립트 이름을 가구 이름으로 설정한 모습..
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Wardrobe : MonoBehaviour
{
public GameObject Ward; // 장롱 오브젝트
public GameObject Player_Body;
public GameObject Player_Light;
public GameObject Player_Flash;
public GameObject Ghost;
public static float time = 0f;
public static bool Hide = false;
public static bool success = false;
void Start()
{
Ward = this.gameObject;
Player_Body = GameObject.Find("Player_Body");
Player_Light = GameObject.Find("Player_Light");
Ghost = GameObject.Find("Ghost_Mother");
}
void Update()
{
// 플레이어 상호작용 입력
if(Vector2.Distance(Ward.transform.position , Player_Body.transform.position) < 2f && Input.GetKeyDown(KeyCode.Space)) {
Hide = !Hide;
}
// 상호작용 기능 구현
if (Hide) {
Active(false);
Player_Flash.SetActive(false);
} else {
Active(true);
}
// 상호작용시 가구 기능(장롱) 구현
if(Hide && Vector2.Distance(Player_Body.transform.position, Ghost.transform.position) > 6f && Mother_Move.encounter) { // 숨기 성공
success = true;
Mother_Move.encounter = false;
} else if(Mother_Move.encounter && Hide) { // 실패
if(time > 3.1f)
time = 0f;
}
if (success) {
time += Time.deltaTime;
if (!Hide && time < 30f) {
Mother_Move.encounter = true;
success = false;
} else if (Hide && time > 30f) {
success = false;
}
}
if (!success && Hide) {
time += Time.deltaTime;
if(time > 3f)
SceneManager.LoadScene("Gameover");
}
}
void Active(bool b) {
Player_Body.SetActive(b);
Player_Light.SetActive(b);
}
}
상호작용 가구에 달 스크립트, 플레이어에 달 스크립트, GameManager을 생성한다.
Interaction Controller, Interactive Object, GameManager 생성
프리팹에서 상호작용 가구들의 tag를 "Interactable"로 지정한다.
플레이어의 자식 오브젝트로 Interaction Range를 생성, Circle Collider2D를 컴포넌트로 추가하여 상호작용 범위를 설정한다.
플레이어 주위를 둘러싼 초록 원이 상호작용 가능 범위를 나타냄.
스크립트를 작성한다.
private void Update()
{
if (Input.GetKey(KeyCode.Space)) // 물체 상호작용 키
GameManager.instance.interCon.getSign(true);
else
GameManager.instance.interCon.getSign(false);
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteractiveObject : MonoBehaviour
{
public enum ObjTypes { Closet, Drawer, Safe} // Enum을 사용하여 가구 구분
public ObjTypes type; // 현재 가구 타입을 담는 변수
private void Update()
{
}
public void Interaction() // 플레이어가 상호작용시 호출할 함수
{
switch(type) // 각 기능은 switch문에서 구별
{
case ObjTypes.Closet:
Debug.Log("옷장 상호작용");
break;
case ObjTypes.Drawer:
Debug.Log("서랍 상호작용");
break;
case ObjTypes.Safe:
Debug.Log("금고 상호작용");
break;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteractionController : MonoBehaviour
{
[SerializeField]GameObject InteractableObj = null; // 주변 상호작용 가능한 가구 오브젝트를 담는 객체
[SerializeField] bool onInteraction = false; // 상호작용 키 활성화 여부
private void Update()
{
if (onInteraction && InteractableObj)
InteractableObj.GetComponent<InteractiveObject>().Interaction(); // 상호작용 기능 호출
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Interactable") && !InteractableObj) // 상호작용 가구가 상호작용 범위에 들어오면
InteractableObj = other.gameObject;
}
private void OnTriggerExit2D(Collider2D other)
{
if (InteractableObj && other.CompareTag(InteractableObj.tag)) // 상호작용 가구가 상호작용 범위에서 나가면
InteractableObj = null;
}
public bool getOnInteraction()
{
return onInteraction;
}
public void getSign(bool b)
{
onInteraction = b;
}
public void changeSign()
{
onInteraction = !onInteraction;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public InteractionController interCon;
private void Awake()
{
if (!instance) // 싱글톤
instance = this;
}
}