최대 4인의 플레이어가 협동하여, 근거리/원거리 몬스터를 무찌르는 로컬 멀티 액션 게임입니다. 언리얼 엔진 5.5.4로 개발하였으며 경기게임아카데미 창업과정에 선정되는 성과를 거두었습니다.
/Source
├── GameCore // 공통 인터페이스, 유틸
├── PlayerModule // 플레이어 캐릭터, 입력
├── MonsterModule // 몬스터, AI, 비헤이비어 트리
├── UIModule // HUD, UI 위젯
├── QuestModule // 퀘스트, 미션 관련
├── SoulModule // 소울
├── ArmourModule // 갑옷
└── FourQuest // GameMode, GameInstance 등
FourQuest
├── QuestModule
│ └── GameCore
│ └── UIModule
├── PlayerModule
│ └── GameCore
│ └── UIModule
├── MonsterModule
│ └── GameCore
│ └── UIModule
├── SoulModule
│ └── GameCore
│ └── UIModule
├── ArmourModule
│ └── GameCore
│ └── UIModule
└── GameCore (의존성 없음)
이전 프로젝트에서는 모든 기능이 주 게임 모듈에 통합된 구조로 개발되어 팀원 간의 작업 공간 분리가 이루어지지 않았습니다. 이로 인해 유지보수와 협업 시 어려움이 있었고, 이러한 문제를 개선하고자 해당 프로젝트에서는 프로젝트를 기능 단위 모듈로 분리하였습니다. 각 모듈은 오직 공통 로직이 담긴 GameCore 모듈과 UI 모듈에만 의존하도록 설계하여 의존성을 최소화하였습니다.
플레이어의 다양한 행동 및 스킬 상태는 외부 클래스에서 알 필요가 없다고 판단했습니다. 공격 대상에게는 데미지 수치나 넉백 세기 등 변수만 전달하면 된다고 생각했기 때문입니다. 따라서 플레이어 모듈 내부에 UENUM을 활용한 상태 관리 시스템을 구축하였고 이동 가능 여부, 피격 반응, 콤보 상태 등을 별도의 enum class를 만들어 관리하였습니다.
enum class
플레이어 상태PlayerBase
├── KnightPlayer // 기사 플레이어
├── MagePlayer // 마법사 플레이어
└── (추후 직업 추가 시 PlayerBase를 상속)
플레이어 시스템은 공통 로직과 직업별 고유 로직의 분리를 목표로 계층적으로 설계하였습니다. 공통 동작은 PlayerBase 클래스에서 처리하고, 이를 상속받는 각 직업별 클래스에서는 입력 처리, 전투 스킬 등 로직을 구현하여 기능을 확장하는 구조로 구성하였습니다.
같은 키를 누르더라도 각 직업별로 다른 입력 처리를 구현하기 위해 향상된 입력 시스템을 사용하였습니다. 기본 움직임 입력을 처리하는 Input Mapping Context와 각 직업별 입력을 처리하는 Input Mapping Context를 분리하고, 각각 우선순위 0번, 1번에 바인딩함으로써 입력 충돌을 방지하였습니다.