내일배움캠프/TIL

[내배캠][Unity6기][TIL] Scene Reload 버그 트러블슈팅 (2)

binary는 호남선 2024. 12. 16. 21:41

플레이를 한번 진행한 후 해당 스테이지를 다시 시작하거나, 다른 스테이지를 진행할 때 종료 로직이 실행되지 않는 문제가 있어 수정했다.

 

게임 종료 로직을 DontDestroyOnLoad 객체인 GameManager가 관리하게 했는데, 처음에 이벤트를 연결했던 객체들이 Scene을 다시 로드하며 파괴되고 새로운 객체로 생성되며 종료 로직을 실행하지 않는 문제였다.

 

[ 기존 코드 ]

GameManager.cs

public class GameManager : SingletonBase<GameManager>
{
    protected override void Awake()
    {
        base.Awake();
        DontDestroyOnLoad(this);
    }

    private void OnEnable()
    {
        HumanManager.Instance.OnGameClear -= GameClear;
        HumanManager.Instance.OnGameClear += GameClear;
        StageManager.Instance.OnGameOver -= GameOver;
        StageManager.Instance.OnGameOver += GameOver;
    }
}

 

스테이지를 재시작하거나 새로운 스테이지로 넘어가면 이미 삭제된 HumanManager와 StageManager의 인스턴스를 참조한다. 새로 생성된 인스턴스를 참조하도록 수정이 필요하다.

 

일단 DontDestoryOnLoad 객체인 GameManager가 아닌 Scene 전환 시 파괴되는 GameController를 만들어 새로운 인스턴스를 참조하도록 수정하였다. 만약 로직상 반드시 GameManager에 들어가야하면 SceneManagement를 사용하거나 다른 방법을 고려해볼 예정이다.

 

[ 수정 코드 ]

GameController.cs

public class GameController : MonoBehaviour
{
    private void OnEnable()
    {
        HumanManager.Instance.OnGameClear -= GameClear;
        HumanManager.Instance.OnGameClear += GameClear;
        StageManager.Instance.OnGameOver -= GameOver;
        StageManager.Instance.OnGameOver += GameOver;
    }
}