프로젝트를 진행하면서 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으로 어디에서나 사용할 수 있게끔 해야한다.
'Unity' 카테고리의 다른 글
[C#] 재귀 호출과 구조체(struct) 및 구조체와 클래스의 차이 (0) | 2023.11.06 |
---|---|
[Unity] 카드 매칭 게임 프로젝트 마무리 (0) | 2023.11.03 |
Unity Scene 불러오는 법 SceneManager.GetActiveScene() (1) | 2023.11.01 |
PlayerPrefs를 이용해 데이터 저장하기 (2) | 2023.10.31 |
[Unity](빗방울 게임 마무리) 게임 끝내기 (1) | 2023.10.27 |