미니 프로젝트에서 내가 맡았던 일인 게임의 종료조건을 구현하기로 했다.
게임의 종료 조건 2가지
일단 게임 종료시 나올 패널을 만들었다.
팀원의 에셋을 이용하여 만들어 보았다.
void GameOver()
{
if (gameTime <= 0)
{
gameoverPanel.SetActive(true); // 숨겨져있던 게임오버의 판넬을 보여주게 한다.
Time.timeScale = 0; // 게임을 멈춘다.
}
}
GameOver()를 Update()에서 돌려서 충족시에 게임을 멈추고 게임오버 판넬을 보여주도록 하였다.
gameoverPanel.SetActive(ture);
Time.timeScale = 0;
처리를 하여 동일하게 멈추게 하고 판넬을 보여주게 하였다.
판넬에 보이는 RETRY 버튼과 TITLE버튼은 각각 버튼 UI로 만들어 판넬의 자식 오브젝트로 두고
SceneManager.sc를 만들어 그 스크립트 안에 LoadScene기능을 모아두었다.
그 기능들을 RETRY Button과 TITLE Button의 Event에 각각의 Event를 적용하여 각자 상황에 맞는
Scene으로 Load하도록 만들었다.
그렇게 몇번의 테스트를 하는 도중에 오류를 하나 발견하였다.
게임을 RETRY하여 다시 시작하면 GameManager가 두 개가 생기고 하나에는 public으로 GameManager스크립트 안에 선언해둔 gameoverPanel이 자꾸 빠진다는 것 이었다.
계속해서 실행과 중지를 해가며 비교를 해보고 스크립트를 확인했을 때 어느점이 이상한지는 알게 되었다.
팀원이 GameManager를 따로 싱글톤 스크립트를 작성해 lock을 걸고 DontDestroyOnLoad하여 상속 시키는 방식으로 사용을 하였는데
저 DontDestroyOnLoad로 인해서 GameManager가 씬이 재시작 될 때 사라지지 않고 두개가 생기고 자꾸 오류가 나는 것 이었다.
그 뒤로는 계속 고민을 하였으나 DontDestroyOnLoad라는 기능이나 lock을 거는 것, 싱글톤 스크립트를 작성해 다른 스크립트에 상속시켜 사용하는 것, 아직 초보인 나는 그런 기능을 몰랐기에 튜터님의 도움을 받아서 해결방법을 알게 되었다.
우리는 2번의 방법을 사용하기로 했지만 그 전에 코드들을 깔끔하게 하기위해 gameManager에 있던 코드들을
MainGame이라는 스크립트를 만들어(main Scene에서 main에서 작동하는 게임기능만 빼서 관리하기위해)
각 각의 기능에 맞게 분배를 하고 gameManager를 TITLE로 옮겨 가져와서 오류를 해결하는데 성공하였다.
처음보는 기능들이 많아서 상당히 어려웠지만 그래도 많이 배웠다. 전부 이해는 못하지만 그래도 이 상황과 경우를 통해서 다음에 볼 때는 좀 더 빠르게 이해를 하거나 해결방법을 생각할 수 있게 되는 좋은 시간이었다.
항상 도움을 주는 튜터님과 팀원들에게 감사한다.