Unity

[Unity] TimeScale 사용시 유의할 점

박도치 2023. 11. 2. 21:36

프로젝트를 진행하면서 TimeScale을 통해 게임 종료시 게임을 멈추거나 일시정지 등 유용하게 사용할 수 있다. 사용방법은 아래와 같다.

 

 

1.TimeScale을 이용한 시간 정지 및 재생

GameManager.cs 중 일부분

    /* 게임 종료 시 일어나는 함수 */
    void GameEnd()
    {
        string sceneName = scene.name;
        isRunning = false;
        trialText.text = trialNum.ToString() + "회";      // trialText를 업데이트
        warningBackground.gameObject.SetActive(false);
        Time.timeScale = 0f;

        endPanel.SetActive(true);

        thisScoreText.text = time.ToString("N2");

        if (time > maxTime || trialNum == trialLeft)         // 실패
        {
            thisScoreText.text = "Failed";
            time = maxTime;
        }
       
        /*하드 게임 플레이시 최고점수 및 현재점수 기록*/
        if (sceneName == "NormalScene")
        {
            GameNormalScore();
        }
        /*헬 게임 플레이시 최고점수 및 현재점수 기록*/
        else if (sceneName == "HardScene")
        {
            GameHardScore();
        }
        else
        {
            GameEasyScore();
        }
        //endTxt.SetActive(true);

    }

 

위 코드는 게임 종료시 실행되는 함수이다. 7번째 줄을 보면 Time.timeScale = 0f; 라고 쓰여있는데 이는 게임이 끝났을 때 deltatime 시간을 정지시켜 게임을 더 이상 진행하지 못하게 하는 역할을 한다. 시간을 다시 재생시키고 싶다면 아래 코드를 Start나 Awake에 넣어 게임이 실행되기 전 시작할 때 다시 시간을 진행시키면 된다.

 

 

void Awake() 
	{
    		Time.timeScale = 1.0f;
	}

 

 

2. timeScale사용시 문제점

 

invoke함수와 사용할 때 문제를 발견했는데, timeScale이 0이되면 invoke함수도 함께 멈추게 된다. 그래서 Scene을 Load하거나 필요할 때 꼭 timeScale을 1로 다시 돌려줘야 하는데, 만약 게임이 끝난 후 홈으로 돌아갔을 때 위 코드처럼 timeScale이 0 인채로 홈으로 돌아가는 현상이 일어난다. 

 

위 cs는 GameManager.cs부분이기 때문에 StartScene이 담겨있는 씬으로 넘어가버리면 timeScale 이 0 인채로 그대로 넘어가서 시간이 멈춰 Invoke함수가 홈에서 실행되지 않는 상황이 발생한다.

 

 

3. 해결방안

해결방법은 역시 StartScene에 마찬가지로 Time.timeScale = 1f를 줘서 다시 시간을 가게끔 하면 되는 방법이 있다. 하지만 더 좋은방법이 있는데 이는 timeScale함수를 isPause같은 bool값을 return하는 변수를 둬서 관리해 주는 것이 더 효율적이다.

 

timeScale을 여러곳에 사용할 수도 있고, flase와 true가 결국 짝이 맞아야 멈췄다 재생했다를 반복하기 때문에 한 곳에 관리하여 짝이 맞다면 문제가 없지만 짝이 맞지 않은 경우 문제가 생기기 때문에 몇 시간씩 오류를 찾기 보다는 한 곳에서 바로 찾을 수 있는 효율이 있기 때문이다.

 

결론은 프로젝트는 혼자서 개발하는 경우도 있지만, 팀 프로젝트나 효율을 위해서라면 사용 처마다 timeScale을 사용하는 것이 아닌, public으로 어디에서나 사용할 수 있게끔 해야한다.