이번 프로젝트에서 GameManager의 기능이 복잡해지면서 버그가 많이 생긴 것 같다.
유니티 생명주기, 이벤트의 활용, 코루틴, timeScale 조절 등이 겹치면서 원치 않는 타이밍에 동작하거나 잘못 실행되는 내용들이 많았고, 게임매니저의 역할과 관련해서 의문점이 생기기도 했다.
그래서 이번 프로젝트에서 작성한 GameManager의 내용을 다시 돌아보게 되었다.
GameManager의 구조
현재 게임매니저는 GameScene의 로직을 총괄하는 역할을 하고 있다. (여기서부터 잘못된 것..)
게임 진행에서 필요한 정보를 저장하고, 스테이지 판별, 게임 종료 등의 로직을 수행한다.
생명 주기와 관련해서는 Start(), FixedUpdate()를 쓰고 있다.
Start()에서 SetGame()메서드를 통해 게임을 세팅한다. (스테이지1, 블록 깔기, 데이터 불러오기 등 )
FixedUpdate()에서는 게임 종료 판단, 스테이지 클리어 판단을 진행하고 관련된 메서드 호출 및 이벤트를 발생시킨다.
Stage 클래스는 스크립터블 오브젝트 형태로 만들어져 있는데,
게임매니저는 블록을 생성하거나 블록을 지울 때, 스테이지 정보를 리셋할 때, 스테이지마다 바뀌는 정보(벽돌 리젠 타임 등)를 가져와야 할 때마다 스테이지 오브젝트로부터 정보 및 실행 내용을 불러와서 쓰고 있다.
또한 추가적으로 동물의 효과를 컨트롤하는 메서드도 포함되어 있는데, 논리상으로 게임매니저가 관리할 내용은 아니지만, 구현에 어려움이 있어서 임시로 여기에 만든 듯하다.
문제 발생
수정을 통해 문제가 많이 해결되었지만, 아직 치명적인 버그가 남아 있다.
강화 정보가 게임에서 반영되지 않는 것인데, 여러 원인이 있지만 그 중 큰 문제는 게임매니저가 GameScene 내에서 작용하기 위해 설계되었다는 점인 것 같다.
플레이어, 동물 강화 내용, 랭킹 등은 게임 전역에서 필요한 정보이다. 그런데 이 정보를 모두 가지고 있는 것은 게임매니저밖에 없다.
동물 강화 내용과 랭킹은 스크립터블 오브젝트로 관리되고 있기 때문에 다른 씬에서도 정보를 가져와서 쓸 수 있다.
문제는 플레이어가 스크립터블 오브젝트로 관리되는 것이 아니라, 계속해서 Instantiate / Destroy 되고 있는 프리팹에 Player 스크립트를 붙여서 쓰고 있다는 것이다.
이 때문에 HomeScene에서 Player의 정보를 불러오는 데 문제가 생기고 있으며, 구현이 되지는 않았지만 Player의 정보를 HomeScene에서 변경할 수 있도록 기능을 추가할 경우 GameManager로 추가적인 연결이 필요하다는 번거로움이 생긴다.
해결 방법 생각해보기
현재 구조를 유지하고자 한다면, Player를 스크립터블 오브젝트로 만들면 정보의 공유가 쉬워질 것 같다.
이렇게 한다면 Player Prefab에 이 스크립터블 오브젝트의 정보를 가져오는 스크립트만 붙이는 방식으로 수정하면 된다.
하지만 이렇게 할 경우 본질적인 구조적 문제가 해결되지 않는다.
데이터가 변경될 때마다 서로의 씬에 정보를 넘겨주어야 하는 문제도 있고, GameManager의 역할 또한 여전히 모호하다.
GameManager의 역할은 게임 전반에서 활용되는 정보들을 저장하고 필요한 씬에 넘겨주거나, 게임 전체의 실행 및 종료, 데이터 변경과 저장 등의 역할을 담당하도록 했어야 했다.
Stage와 관련해서는 StageManager를 따로 만들어 게임 플레이 중의 로직이나 변경 처리 등을 담당하게 했어야 했다.
이렇게 하면 데이터의 저장을 게임오버 될 때마다 할 이유도 없고, 코드의 복잡성도 줄어들었을 것 같다.
구조 설계 당시에 너무 많은 생각을 하다 보니 오히려 기본적인 것을 놓친 기분이다.
게다가 스크립터블 오브젝트의 활용 등은 작업 중간에 결정된 사항이라, 처음 생각했던 구조와 달라진 부분도 많았다.
개인 과제 때에는 구조에 더 신경 써서 작업해볼 수 있을 것 같다. 스스로 구조를 설계하는 경험을 하고 나면 다음 팀 프로젝트에서도 보다 많은 기여를 할 수 있을 것 같다.
'👾 내일배움캠프 > 🎮 TIL & WIL' 카테고리의 다른 글
내일배움캠프 30일차 TIL - 스크립트 분리 (0) | 2023.09.21 |
---|---|
내일배움캠프 6주차 WIL - 팀 프로젝트 회고 (0) | 2023.09.21 |
내일배움캠프 28일차 TIL - 코루틴 (1) | 2023.09.21 |
내일배움캠프 26일차 TIL - Json을 활용한 데이터 저장 (0) | 2023.09.21 |
내일배움캠프 25일차 TIL - Scriptable Object (1) | 2023.09.21 |