오늘은 약 1주간 진행한 Unity 개인 프로젝트를 마무리했다. 더 추가해보고 싶은 기능도 남았고, 아쉬움도 많이 남는다. 이번 프로젝트에서 배운점 및 느낀점 등을 정리해보고자 한다.
메인 씬
NPC
- NPC와 상호작용하기 위해 Collider 컴포넌트를 활용했다.
- Collider 컴포넌트를 2개 활용하여 플레이어 캐릭터가 NPC를 통과하지 못하도록 구현하였다.
- NPC가 각자 비슷한 역할을 한다.
- ex) Elf NPC는 FlappyKnight 미니 게임 씬을 열어준다.
- ex) Angel NPC는 메인 게임 씬을 열어준다.
- 따라서 상속 개념을 활용하기로 했다.
- 부모 클래스:
BaseNPCController
TileMap
- TileMap을 사용하여 맵을 구성하였다.
- 플레이어 캐릭터보다 앞에 있는 요소와 뒤에 있는 요소 등을 구분하여 자연스러운 맵 연출이 가능하도록 만들었다.
- Collider를 통해 플레이어 캐릭터가 지나갈 수 없는 구역을 설정해주었다.
- Atlas를 사용하면 맵 깨짐 등의 현상이 줄어든다고 하니, 다음 2D 프로젝트 때는 활용할 수 있도록 해야겠다.
Camera
- 카메라가 플레이어 캐릭터를 자연스럽게 따라다니며 특정 구역 이상으로 지나가지 못하도록 하는 방법을 찾던 중 Cinemachine이라는 기능을 발견했다.
- Package Manager로 Cinemachine을 설치하였다.
- Virtual Camera를 생성하여 Follow에 플레이어를 넣어주어 카메라가 플레이어를 따라 다니며 화면을 출력한다.
- 자연스럽게 지연효과도 넣어주어서 편리했다.
- CinemachineConfiner2D라는 컴포넌트를 활용하여 Bounding Shape 2D에 맵의 가장자리를 두르고 있는 형태의 Polygon Collider2D를 추가하여 카메라가 맵 바깥을 비추지 못하도록 구현하였다.
- 이 기능은 TopDownShooting에도 활용하였다.
미니 게임
- 대부분 내용은 거의 강의를 따라 만들었다. 다만 진행 중 몇가지 문제가 발생하였다.
UI
- 강의와 달리 Manager를 따로 지정해서 관리하도록 바꿔보았다.
- 하지만 실제 게임 화면에 UI가 적용되지 않는 문제가 발생하였다.
- 실제 실행하는 스크립트에 UI작동까지 넣으면 당장 구현할 때는 편하겠지만, 나중에 유지 보수 및 확장에 불리할 것이라 생각했다.
- 따라서 조금 복잡하더라도 역할을 분리하는 연습을 계속 진행해보도록 하겠다.
PlayerPrefs 충돌 (스크립트 이름? 문제)
- 대표적으로 PlayerPrefs 충돌이 일어났는데, 각 게임의 최고 기록이 다른 게임에서 표시되는 오류가 발생하였다.
- 이는 각 게임마다 고유한 키 이름을 정의하여 서로 간섭하지 않도록 분리하여 해결하였다.
- 하지만 이번 프로젝트에서 이름 짓는 것과 관련하여 문제가 생긴 경우가 적지 않았던 것을 보아, 훨씬 효율적인 방법이 있을 것이라 생각했다.
- 그 결과 분리된 스크립트는 각자의 네임스페이스를 적용하여 간섭하지 않도록 하는 방법이 있다는 것을 알았다.
- 다음 프로젝트부터는 적극적으로 활용하도록 하겠다.
SceneLoader
- 게임 리스타트 혹은 씬으로 진입할 때, 메인 씬으로 돌아갈 때
SceneLoader.Instance.LoadTheStackScene() 등을 활용하여 씬을 호출하고 있다.
- 하지만 메인씬으로 돌아갈 때, 플레이어가 원래 있던 위치가 아닌, 처음 시작할 때의 위치로 초기화되는 문제가 발생했다.
- 이는 씬을 호출하기 전에 플레이어의 위치를 기억하고, 다시 나갈 때 이를 불러오는 식으로 해결하였다.
- 이 과정에서도 네이밍에 관련한 문제가 발생하였는데, 게임씬용 Player태그와 메인씬용 MainPlayer태그를 만드는 식으로 해결하였다.
메인 게임
미구현 내용
사실 메인 게임에서는 구현한 내용보다는 구현하지 못한 내용이 더 많다. 조금 정리해보자면,
- 메인 게임에서 특정 웨이브를 깰 때마다 특정 아이템을 해금하거나 능력치를 강화하는 등의 요소를 넣으려고 했다.
- 또한 웨이브를 깰 때마다 체력을 일정수준 회복해주는 로직을 구현해보려고 했다.
- 다양한 무기들을 사용할 수 있도록 하려고 했으며 이는 메인씬에 있는 상점을 통해 구현해보고자 했다.
- 상점에서 쓸 수 있는 재화는 미니 게임을 통해 얻을 수 있도록 구현하고자 했으나, 시간부족으로 결국 전부 구현하지 못했다.
회고 및 느낀점
- 아직 갈 길이 멀다는 것을 느꼈다. 처음부터 끝까지 내가 만들어보며 막히는 부분도 많았고, 강의나 교안의 도움없이 해결하는 것은 불가능한 수준에 가까웠다.
- 하지만, 강의를 그저 따라하는 것이 아닌, 역할 분리를 통한 확장성에 기반하여 조금씩 수정하다보니 개발이 약간 익숙해진 것 같기도 하다.
- 그럼에도 여전히 부족하다. 너무 많은 스크립트로 인해 특정 기능을 넣기 위해서 어디를 건드려야 할지를 구분하기 어려웠고, 변수명, 클래스명 등이 서로 간섭하는 문제도 많이 생겼다.
- 이를 해결하는 과정을 통해 프로젝트 관리의 중요성을 느끼기도 했다.
- 또한 실제로 계속 플레이해보며 발견된 버그들을 고치는 거나, 유저 입장에서 불편할만한 UI 등의 요소들을 수정해가며 유저 입장에서 게임을 설계하는 것이 중요함을 깨달았다.
- 이제 내일 팀 프로젝트 발제를 하는데, 본 프로젝트에서도 이번에 느낀 점들이 잘 드러나고, 고칠 점들은 잘 고쳐서 진행할 수 있도록 하겠다.