유니티는 Multiplayer 게임을 지원하기 위해 Netcode for GameObjects라는 걸 지원하고 있는데,
데모 프로젝트인 Boss Room이라는 게임도 함께 만들어두었습니다.
물론, 깃허브에 소스코드도 모두 공개해주었습니다.
유니티로 멀티플레이를 처음 구현해보는 사람에게는 교과서같은 프로젝트입니다.
유니티를 공부할 때 Docs나 강의, 책을 보고 공부하는 것도 좋지만, 가끔은 이렇게 잘 만들어진 소스코드 전체를 확인하면서 흐름을 잡아가는 것도 좋아 보입니다.
이 보스룸 프로젝트를 분석해 도움이 될 만하거나 흥미로운 지점들을 계속해서 써내려 갈 예정인데,
이 포스팅에서는 프로젝트의 가장 기본이 되는 구조부터 뜯어보겠습니다.
글을 읽기 전에 실제로 게임을 한 판 하고 오시면 이해에 도움이 됩니다.
2P 이상 참여해야 플레이가 가능합니다. (한 명이 버튼 누르고 문 열어줄 때 나머지 한 명이 문을 통과해야 함)
Assets 폴더는 씬, 개발자가 작성한 소스코드, 프리팹이 모두 모여 있는 폴더입니다.
유니티 개발을 하면 대부분의 작업은 이 Assets 폴더 안에서 하게 됩니다.
전체 파일의 구조는 아래와 같지만, 너무 방대하니 조금씩 잘라서 설명하겠습니다.
.
├── Animations
│ └── UI
├── Fonts
├── GameData
│ ├── Action
│ │ ├── Archer
│ │ ├── Boss
│ │ ├── General
│ │ ├── Imp
│ │ ├── Mage
│ │ ├── Rogue
│ │ ├── Tank
│ │ └── VandalImp
│ ├── Avatars
│ ├── Character
│ │ ├── Archer
│ │ ├── Imp
│ │ ├── ImpBoss
│ │ ├── Mage
│ │ ├── Rogue
│ │ ├── Tank
│ │ └── VandalImp
│ ├── Collections
│ ├── Game
│ │ ├── EnemySpawner
│ │ └── SpawnedEnemy
│ ├── GameEvents
│ ├── Shared
│ ├── Systems
│ ├── Transforms
│ └── UI
├── Material
│ ├── Characters
│ │ └── Toon
│ └── Dungeon
├── Models
│ ├── Animated
│ └── Animation Controllers
├── Prefabs
│ ├── Actions
│ ├── CharGFX
│ │ ├── CharacterGraphics
│ │ │ └── CharacterSelect
│ │ └── Head
│ ├── Character
│ ├── Dungeon
│ │ └── Dungeon Pieces
│ │ ├── animated
│ │ ├── crystal
│ │ ├── pillar
│ │ └── pots
│ ├── Game
│ │ └── StaticNetworkObjects
│ ├── GameCam
│ ├── Menus
│ ├── State
│ └── UI
├── Scenes
│ ├── BossRoom
│ └── PostGame
├── Scripts
│ ├── ApplicationLifecycle
│ │ └── Messages
│ ├── Audio
│ ├── CameraController
│ ├── Editor
│ │ └── Readme
│ ├── Gameplay
│ │ ├── Action
│ │ ├── Configuration
│ │ ├── ConnectionManagement
│ │ ├── DebugCheats
│ │ ├── GameState
│ │ ├── GameplayObjects
│ │ │ ├── AnimationCallbacks
│ │ │ ├── Audio
│ │ │ ├── Character
│ │ │ │ └── AI
│ │ │ └── RuntimeDataContainers
│ │ ├── Input
│ │ ├── Messages
│ │ └── UI
│ │ └── Lobby
│ ├── Infrastructure
│ │ ├── PubSub
│ │ └── ScriptableObjectArchitecture
│ │ └── Editor
│ ├── Navigation
│ ├── UnityServices
│ │ ├── Auth
│ │ ├── Infrastructure
│ │ │ └── Messages
│ │ └── Lobbies
│ │ └── Messages
│ ├── Utils
│ │ └── NetworkOverlay
│ └── VisualEffects
├── Shaders
├── Sounds
│ ├── Character
│ │ ├── Archer
│ │ ├── Boss
│ │ ├── Imp
│ │ ├── Mage
│ │ ├── Rogue
│ │ ├── Shared
│ │ └── Tank
│ ├── Env
│ └── Music
├── StreamingAssets
├── Tests
│ └── Runtime
├── TextMesh Pro
│ ├── Documentation
│ ├── Fonts
│ ├── Resources
│ │ ├── Fonts & Materials
│ │ ├── Sprite Assets
│ │ └── Style Sheets
│ ├── Shaders
│ └── Sprites
├── Textures
│ ├── Characters
│ ├── Environment
│ └── UI
│ └── Unity
├── URP
│ └── Mobile
└── VFX
├── Materials
├── Meshes
├── Prefabs
│ ├── Archer
│ ├── Boss
│ ├── Caster
│ ├── Environment
│ ├── Imp
│ │ └── Throw_bomb
│ ├── Rogue
│ ├── Shared Hero FX
│ ├── Tank
│ └── UI
├── Shaders
└── Textures
다른 걸 다 잘라내고 Assets 하위에 위치한 폴더만 살펴보면,
Assets 폴더의 하위는 아래와 같은 서브 폴더들로 구성되어 있습니다.
.
├── Animations
├── Fonts
├── GameData
├── Material
├── Models
├── Prefabs
├── Scenes
├── Scripts
├── Shaders
├── Sounds
├── StreamingAssets
├── Tests
├── TextMesh Pro
├── Textures
├── URP
└── VFX
대중적인 구조에서 크게 벗어나지 않는 파일 구조를 가지고 있습니다.
게임 씬 저장을 위한 Scenes,
스크립트 저장을 위한 Scripts,
프리팹 저장을 위한 Prefabs, 등등 ...
익숙한 구조입니다.
TextMesh Pro가 익숙하지 않으시다면, 기존의 유니티 UI 텍스트를 완벽히 대체하며 더 고도화된 기능을 제공하는 플러그인이고,
(원래는 유니티 에셋 스토어에서 유료로 팔고 있던 에셋인데 유니티에서 인수해 무료로 제공하게 되었다고 합니다.)
이어지는 글에서 프로젝트 구조를 하나하나 뜯어 살펴보겠습니다.