📌 Unity 게임 개발 숙련 - 팀 프로젝트
📌 게임 설명
🖥️ Skull Soul4
📆 Develop Schedule
⚙️ Environment
Unity 2022.3.2
- IDE : Visual Studio 2019, 2022, MonoDevelop
- VCS : Git (GitHub Desktop)
- Envrionment : PC
only
- Resolution : 1920 x 1080
FHD
👤 Collaborator - Team Intro
- 팀장
성연호
- 몬스터
- 팀원1
김동현
- 맵 자동 생성
- 팀원2
고민수
- 플레이어
- 팀원3
고현규
- UI
- 팀원4
이준호
- GameManager
- 팀원5
나재민
- 아이템, 스킬
▶️ 게임 스크린샷
🎮 만든 기능들
- 랜덤 던전 생성
- 캐릭터 조작
- 아이템 수집
- 몬스터 생성 및 AI
- 전투 시스템
- 피해와 체력 관리
- 보스 전투
- 퍼마데스
- 아티팩트 및 효과
- 레벨업 시스템
- 사운드 효과 및 음악
랜덤 던전 생성
- 맵이 랜덤으로 생성됩니다.
- 시작지점을 중심으로 너비 우선 탐색으로 맵을 새롭게 생성합니다.
- V키를 누르면 맵이 랜덤으로 생성됩니다.
- 맵 중심으로 상하좌우를 가져와서 만들어진 방이면 예외처리하고, 네모형태를 배제하고 일자 형태로 만들기 위해 상하좌우 2개 이상 만들어지면 예외처리 합니다.
- 맵 끝 중 하나를 보스 방으로 생성하고, 또 하나는 레벨업 맵(상점)으로 만들었습니다. 그 외에 다른 맵들은 모두 전투맵으로 만들었습니다.
캐릭터 조작
- 좌우 방향키, 스페이스바로 점프 할 수 있습니다.
- Z키를 눌러 공격할 수 있습니다.
- A키를 눌러 스킬을 사용할 수 있습니다.
아이템 수집
- 몬스터를 잡으면 Gem 과 일시적 효과 아이템이 드랍됩니다.
- 캐릭터가 해당 아이템에 접촉하면 해당 아이템을 얻을 수 있습니다.
- 던전 룸을 클리어 할 때 마다 스킬 아이템을 얻을 수 있습니다.
- 스킬 아이템은 획득 후 A 버튼을 누르면 사용할 수 있습니다.
몬스터 생성 및 AI
- 몬스터가 스폰 위치에 랜덤하게 생성됩니다.
- 주위에 플레이어가 있으면 플레이어르 쫓아오고, 공격합니다.
전투 시스템
- 플레이어는 원거리 공격만 가능하고, 발사체가 몬스터에게 맞으면 됩니다.
- 점프 공격이 가능 합니다.
- 스킬 공격은 각자의 공격력과 쿨타임을 가지고 있습니다.
피해와 체력 관리
- 캐릭터가 피해를 입으면 일정 시간 동안 무적이 됩니다.
- UI 상에서 체력이 줄어든 만큼 텍스트와 bar가 줄어듭니다.
- 값에 직접 접근하지 않고 DataManager를 Private으로 만들어 내부에서만 접근하고, 내부에 접근할 수 있는 메서드를 GameManager를 통해서 접근합니다.
보스 전투
- 보스 맵에 들어가면 보스 방 HP bar가 화면 상단에 나타납니다.
- 보스는 날아다니며, 근접 공격과 원거리 공격을 사용합니다.
- 보스의 전투에서 승리하면 승리 텍스트와 함께 맵 중앙에 포탈이 생성됩니다.
- 포탈로 이동하면 다시 시작 씬으로 돌아가게 됩니다.
퍼마데스
- 체력이 모두 소모되면 사망 애니매이션이 나타납니다. 캐릭터는 이동할 수 없으며 Game Over 텍스트가 등장합니다.
- Game Over 텍스트가 등장하면, Enter를 눌렀을 때 메인화면으로 돌아갈 수 있습니다.
아티팩트 및 효과
- 몬스터가 드랍한 아이템을 먹으면 효과 지속시간 동안 캐릭터의 몸 색이 변합니다.
- 스킬이 벽에 맞거나, 몬스터에 맞으면 폭발하는 효과가 나타납니다.
- 스킬을 사용하면 쿨타임이 스킬창에 표시됩니다.
레벨업 시스템
- 레벨업 맵에 들어가서 NPC와 상호작용 하면 레벨업을 할 수 있습니다.
- 게임 내에서 먹은 Gem을 소모해서 원하는 스탯을 올릴 수 있습니다.
- 올릴 수 있는 스탯은 - 체력 / 공격력 / 이동 속도 / 공격 속도 - 입니다.
사운드 효과 및 음악
- 버튼을 누르면 버튼 효과음이 재생됩니다.
- 메인 씬으로 이동하거나, 스타트 씬으로 이동하면 음악이 재생 됩니다
- 전투 방을 이동하면 음악이 재생 됩니다
- 보스 방에 들어가면 음악이 재생됩니다.
📌 후기
매니저를 관리하는 것은 처음 해보는 것이라 걱정이 많았는데 다른 팀원들이 너무 잘 해주어서 끝까지 잘 마무리 할 수 있었다.
-
GameManager를 중심으로 하위 자식으로 각각 Manager들을 두고 Manager들이 너무 무거워지지 않게 게임에 어디서든 중심으로 필요한 정보만 담아서 사용하려고 했다.
-
DataManager는 캐릭터의 정보(스탯, 돈, 스킬 등)을 관리하고 변수들은 private 또는 프로퍼티로 읽기 전용으로 만들어서 클래스 내부에서만 값을 건들일수가 있게 하여 캐릭터의 정보의 변경이 필요하다면 GameManager에 DataManager의 메서드를 등록해 놔서 GameManager라는 통로를 통해서만 접근이 가능하도록 하였다.
-
AudioManager의 경우는 다른 필요한 곳에서 BGM이나 SFX들이 필요할 때, AudioManager에 Dictionary를 만들고 string을 매개변수로 받는 메서드로 만들어 필요한 BGM이나 SFX의 이름을 string값으로 적으면 소리가 나오도록 관리하였다.
-
UIManager의 경우는 내가 직접 관리한 것은 아니지만, 캐릭터의 스탯을 올릴수 있는 스탯창(상점)을 만들게 되어서 스크립트 StatsWindow를 만들어 AudioManager 하위 자식으로 있는 스탯창에 스크립트를 붙여서 필요한 정보를 받아오도록 하였다.
-
StageManager같은 경우는 다른 맵과 몬스터를 맡은 팀원들이 잘 관리하고 사용해주었다.
새로운 방식으로 코드를 계획하고 짜보는 기회여서 좋았다. 원래는 MVC패턴을 보고 적용시키려 했지만, Event를 사용하여 특정 행동(예 : 스탯 변경 or 체력 감소) 등의 행위에 구독자에게 뿌려주고 싶었지만, Manager에게 단일책임 원칙을 벗어나 너무 무거워지는 듯 하여 일단은 빼고 짜놨다.
그래도 중복되는 코드들이 다수 있어서 리팩토링을 통해서 좀 더 효율적이고 가독성 좋게 바꿧어야 했는데 프로젝트 기간이 짧아서 하지 못한것이 아쉽다. 주말을 통해서 개인적으로 리팩토링을 진행해보려고 한다.