이번주는 개인 프로젝트를 진행하고 개발 장르는 자유주제이기 때문에
나는 타이쿤 이라는 장르를 만들기로 했다.
https://namu.wiki/w/%ED%83%80%EC%9D%B4%EC%BF%A4
그래서 오늘은 타이쿤의 필수 요소인 상호작용에 대해 만들어 봤다.
플레이어가 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을 써서 코루틴을 돌리는게 되는건지
테스트 해봤는데 정상 작동하는 것 같아서 채용하게 되었다.
반응형
'Today I Learned' 카테고리의 다른 글
[내일배움캠프] Unity 게임 개발 심화 - 개인과제 마무리 (0) | 2023.12.29 |
---|---|
[내일배움캠프] Unity 게임 개발 심화 - Material 만들기 (1) | 2023.12.28 |
[내일배움캠프] Unity 게임 개발 심화 - 게임수학(회전) (1) | 2023.12.27 |
[내일배움캠프] Unity 게임 개발 심화 - SOLID원칙 (0) | 2023.12.22 |
[내일배움캠프] Unity 게임 개발 숙련 - 팀프로젝트 마무리 (0) | 2023.12.21 |