Unity_개발일지_35

홍신영·2024년 12월 9일
0

Unity

목록 보기
37/64

오늘은 트러블 슈팅을 작성해본다.

문제

분명 잘 되던!!
퍼즐 클리어 검사를 하고 모든 퍼즐이 클리어 되어야 스테이지가 클리어 되던 로직이 작동을 안하는 문제 발생.

원인

원인은
리펙토링을 하다 던전씬에 들어오면 던전 매니저, 퍼즐 매니저, 스폰 매니저를 생성해주도록 바꿨는데 던전이 불러와지는 동시에 던전에 존재하는 퍼즐 오브젝트의 Start함수에서 퍼즐 매니저의 Regist함수를 호출하고 있었다.

하지만 Start는 한 번 호출하고 빨리 호출되는데 던전이 생성되며 매니저가 생성되는지라 순서가 꼬인 것이다.

그래서 Start함수에서는 퍼즐 매니저가 null이 뜨게 된 것.

해결

puzzle에서 puzzleManager의 Regist함수를 호출하고 있는데
아래는 기존코드이다.

protected virtual void Start()
{      
	GameManager.Instance.PuzzleManager?.RegisterPuzzle(this);
}

위 처럼 Start에서 그냥 호출했다면,
아래는 변경된 코드이다.

protected virtual void Start()
    {
        if (GameManager.Instance.PuzzleManager != null)
        {
            GameManager.Instance.PuzzleManager?.RegisterPuzzle(this);
        }
        else
        {
            StartCoroutine(WaitAndRegister());
        }
    }

널 일때는 코루틴을 호출하도록 하였고, 이어서 코루틴 코드를 보자.

    private IEnumerator WaitAndRegister()
    {
        while (GameManager.Instance.PuzzleManager == null)
        {
            yield return null;
        }
        GameManager.Instance.PuzzleManager.RegisterPuzzle(this);
    }

while문을 통해 puzzleManager가 널이면 대기하고, null이 아니게 되면 puzzleManager의 Regist함수를 드디어 호출하도록 하였다.
코루틴을 사용하면 비동기적이여서 대기를 하면서 다른 작업을 처리할 수 있고, yield를 통해 프레임 단위로 대기를 할 수 있었다.

위 코드로 변경을 하고 실행을 해보니..
다행히 문제는 해결되었다.

이번으로 느낀 것은 씬을 불러오거나 매니저를 생성하는 시점 등을 기억하고 null일 가능성에 대한 예외처리구문을 작성해야 겠다는 생각이 든다.

예외처리 꽤 중요하구만..

profile
게임 클라이언트 개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN