이번주는 개인 프로젝트를 진행하고 개발 장르는 자유주제이기 때문에

나는 타이쿤 이라는 장르를 만들기로 했다.

 

https://namu.wiki/w/%ED%83%80%EC%9D%B4%EC%BF%A4

 

타이쿤 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

그래서 오늘은 타이쿤의 필수 요소인 상호작용에 대해 만들어 봤다.

 

플레이어가 Ray를 쏘고 물체가 걸리면 상호작용 Text가 나오게 만들었다.

그리고 InputAction을 이용해 해당 키를 누르고 있을때 UIBar가 줄어드는 연출을 주는

방식을 구현했다.

 

Ray를 쏴서 물체를 감지하는 코드

 Ray ray = new Ray(transform.position, transform.forward);
 Physics.Raycast(ray, out RaycastHit hit, 1f);
 if (hit.collider != null)
 {
     if (hit.collider.gameObject != curInteractGameobject)
     {
         curInteractGameobject = hit.collider.gameObject;
         curInteractable = hit.collider.GetComponent<IInteractable>();
         itemPromptText.gameObject.SetActive(true);
     }
 }
 else
 {
     curInteractGameobject = null;
     curInteractable = null;
     itemPromptText.gameObject.SetActive(false);
     InteractionUIbar.gameObject.SetActive(false);
 }

 

키입력시 행동구현 코드

 public void OnInteractionInput(InputAction.CallbackContext context)
 {
     if (curInteractable != null && curInteractGameobject.CompareTag("Item"))
     {
         if (context.phase == InputActionPhase.Started && curInteractable != null)
         {
             curInteractable.OnInteract();
             curInteractGameobject = null;
             curInteractable = null;
             itemPromptText.gameObject.SetActive(false);
         }
     }
     else if (curInteractable != null && curInteractGameobject.CompareTag("Maker"))
     {
         itemPromptText.gameObject.SetActive(false);
         InteractionUIbar.gameObject.SetActive(true);

         if (context.phase == InputActionPhase.Started && curInteractable != null)
         {
             curInteractable.OnInteracting();
         }
         else if (context.phase == InputActionPhase.Canceled)
         {
             curInteractable.UnInteracting();
         }
         curInteractGameobject = null;
         curInteractable = null;
     }
 }

 

UIBar 게이지 조절 기능 구현 코드

public class InteractionObject : MonoBehaviour, IInteractable
{
    public ChangeUIBar interactingUI;

    void Start()
    {
        interactingUI.curValue = interactingUI.StartValue;
    }

    void Update()
    {
        interactingUI.uiBar.fillAmount = interactingUI.GetPercentage();
        if (interactingUI.curValue <= 0f)
        {
            Destroy(gameObject);
        }

        if (interactingUI.uiBar.gameObject.activeSelf == false)
        {
            StopCoroutine("Subtract");
        }
    }

    public void OnInteract()
    {
        //TODO 인벤 만들면 넣어주는 기능 추가
        Destroy(gameObject);
    }

    public void OnInteracting()
    {
        StartCoroutine("Subtract");
    }

    public void UnInteracting()
    {
        StopCoroutine("Subtract");
        interactingUI.curValue = interactingUI.StartValue;
    }

    IEnumerator Subtract()
    {
        while (interactingUI.curValue > 0)
        {
            interactingUI.curValue -= 1f;
            yield return new WaitForSeconds(0.1f);
        }
    }
}

 

UIBar 게이지를 조절하는데 while문을 이용해서 반복을 줬다.

문제는 한프레임에 반복되는 속도가 너무 빨라서 딜레이를 주는 방법이 필요했다.

그래서 코루틴을 사용 해보기로 했는데 어떤식으로 코드를 짜야할지 고민하다가

코루틴 안에 while문을 넣어서 yield return을 써서 코루틴을 돌리는게 되는건지

테스트 해봤는데 정상 작동하는 것 같아서 채용하게 되었다.

반응형