이전 대화 로직 구현에서 기능 추가를 하기 위해 코루틴 내용을 추가하였다.
Coroutine은 Unity에서 시간 지연을 구현하거나, 비동기 작업을 처리할 때 사용되는 특별한 함수.
IEnumerator를 반환하고, 내부에서 yield return을 사용하여 실행을 일시 중단하고 나중에 다시 이어서 실행할 수 있음.
대화를 z키를 통해 넘기기 위해 아래 코루틴 코드를 사용했다.
if (dialog.returnStep > 0)
{
StartCoroutine(NextZ(dialog.returnStep));
}
else if (!isInputBlocked)
{
isInputBlocked = true;
// StartCoroutine(NextZ(step += 1));
currentCoroutine = StartCoroutine(NextZ(step + 1));
}
}
...
private IEnumerator NextZ(int step)
{
// 키가 눌린 상태면, 먼저 뗄 때까지 대기
yield return new WaitWhile(() => Input.GetKey(KeyCode.Z));
// 그 다음 눌렀을 때 진행
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Z));
ShowDialog(step);
}
위 코루틴 사용 중 문제가 발생했는데
소스가 코루틴을 재귀호출 하는 방식으로 되어있다보니,
대화 종료 후에도 코루틴이 남아있어 실행 중 자잘한 버그가 발생하였다.
코루틴을 담기위한 변수를 생성하고 위에 작성한 currentCoroutine =StartCoroutine(NextZ(step + 1));를 통해 값을 담았다.
이후 아래 StopCoroutine을 통해 코루틴을 닫아 해결하였다.
private Coroutine currentCoroutine; // 대화 코루틴
if (currentCoroutine != null)
{
StopCoroutine(currentCoroutine);
}