카테고리 없음
오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 63일차(최종프로젝트 14일차 코루틴 지연 시간 버그)
코드천자문
2024. 1. 31. 02:27
반응형
코루틴을 이용한 시간 제어 이슈 해결기
문제 상황
게임 플레이의 시간 정지와 시간 지연을 코루틴을 사용하여 제어하려 했다. 그런데 중지했을 때, 코루틴이 중지되지 않아 코루틴으로 실행 중인 오브젝트가 멈추지 않는 문제가 발생했다.
해결 시도
1차 시도: 게임 상태에 따라 코루틴 제어
if (Main.Game.CurState != GameState.PAUSE)
{
yield return new WaitForSecondsRealtime(0.02f);
}
처음에는 메인 게임 매니저에 있는 상태를 나타내는 이넘(Enum) 값을 이용하여 구분하려 했다.
그런데 이 코드는 코루틴이므로, if문에서 조건이 만족하지 않을 경우 바로 리턴하는 것이 아니라,
그 아래의 코드도 실행되는 문제가 있었다.
결국, 이 방법은 0.02초를 추가로 기다린 결과를 가져왔다.
2차 시도: 조건문 안에서 코루틴 제어
while (Mathf.Abs(Time.timeScale - _targetTimeScale) > 0.001f)
{
if (Main.Game.CurState != GameState.PAUSE)
{
Debug.Log("나 실행되고 있어");
Time.timeScale = Mathf.Lerp(Time.timeScale, _targetTimeScale, Time.fixedUnscaledDeltaTime * ChangeSpeed);
Time.fixedDeltaTime = Time.timeScale * 0.02f;
yield return new WaitForSecondsRealtime(0.02f);
}
yield return new WaitForSecondsRealtime(0.02f);
}
두번째로, 조건문 안에서 코루틴을 제어하여 시도해 보았다.
이 방법은 게임이 일시정지 상태가 아닐 때에만 코루틴이 작동하게 만들었다.
그런데 이 방법은 평소에도 0.02초를 기다리는 문제가 있었다.
즉, 게임이 멈출 때까지의 시간이 더 오래 걸리게 되었다.
3차 시도 해결 : 코루틴의 yield 값 조정
while (Mathf.Abs(Time.timeScale - _targetTimeScale) > 0.001f)
{
if (Main.Game.CurState != GameState.PAUSE)
{
Debug.Log("나 실행되고 있어");
Time.timeScale = Mathf.Lerp(Time.timeScale, _targetTimeScale, Time.fixedUnscaledDeltaTime * ChangeSpeed);
Time.fixedDeltaTime = Time.timeScale * 0.02f;
yield return new WaitForSecondsRealtime(0.02f);
}
else
yield return null;
}
세번째로, 조건에 따라 코루틴의 yield 값을 조정하여 시도해 보았다.
게임이 일시정지 상태일 때는 yield값을 null로 설정하여 코루틴을 멈추게 했다.
이 방법은 게임이 멈추는 것을 잘 제어하였고, 평소에도 추가로 기다리는 시간을 주지 않았다.
결론
현재로서는 이 방법이 잘 작동하고 있다. 다만, 보다 간결하고 짧은 코드를 사용할 수 있을 것으로 판단되므로, 추후 최적화와 가독성을 고려하여 코드를 리팩토링할 계획이다.
이 문제를 해결하면서, 코루틴의 동작 방식을 자세히 이해하게 되었고, 그 특성을 활용하여 문제를 해결하는 능력을 키웠다. 다음에는 이런 문제를 더 빠르게 인식하고 해결할 수 있을 것이다.
반응형