내일배움캠프/TIL

[내배캠][Unity6기][TIL] 게임 로직 리팩토링

binary는 호남선 2024. 12. 26. 21:20

 게임 종료 로직과 풀에 활성화된 오브젝트를 반환하는 로직을 이벤트로 관리했는데, 이벤트가 여기저기 흩어져 있어 한번에 파악이 어려워졌다. 이벤트가 아닌 GameManager에서 관련 로직을 관리하게 만들어 한번에 파악하기 쉽도록 변경했다.

public class GameManager : SingletonBase<GameManager>
{
    public List<GameObject> activeObjects = new List<GameObject>();
    
    protected override void Awake()
    {
        base.Awake();
        
        // 매니저 중 DontDestroyOnLoad 인 인스턴스만 주석 활성화하여 사용
        DontDestroyOnLoad(this);
    }

    private void Start()
    {
        Application.targetFrameRate = 60;
    }
    
    public void GameClear()
    {
        StageManager.Instance.CaculateStars();  // 플레이 정보로 별 계산
        StageManager.Instance.SavePlayData();  // 스테이지 플레이 정보 저장
        StartCoroutine(EndGameProcess<WinPopup>());
    }
    
    public void GameOver()
    {
        StartCoroutine(EndGameProcess<LosePopup>());
    }

    private IEnumerator EndGameProcess<T>() where T : UIBase
    {
        Time.timeScale = 0;
        yield return new WaitForSecondsRealtime(0.5f);
        UIManager.Instance.ShowPopup<T>();
    }

    public void ReturnObjects()	// 게임 종료나 스테이지 재시작 시 호출
    {
        while (activeObjects.Count > 0)
        {
            string objectName = activeObjects[0].name;
            PoolManager.Instance.ReturnToPool(objectName, activeObjects[0]);
        }
    }

    private void OnDestroy()
    {
        ReturnObjects();
    }
}