게임 시스템 구현
게임 프레임워크를 바탕으로 캐릭터·전투·인벤토리·UI·AI 시스템을 단계별로 통합합니다.
이전 절에서 우리는 게임 프로젝트의 성공적인 시작을 위한 기획과 설계의 중요성에 대해 알아보았습니다.
명확한 GDD(게임 디자인 문서)와 TDD(기술 설계 문서)는 개발의 길잡이가 되며, 이제 이 설계도를 바탕으로 언리얼 엔진에서 실제로 게임 시스템을 구현하는 단계에 돌입할 차례입니다.
이 절에서는 언리얼 엔진의 핵심 기능을 활용하여 게임의 주요 시스템을 어떻게 구현할 것인지에 대한 구체적인 방법론을 제시합니다.
프로젝트 설정 후 게임 규칙, 입력, 캐릭터, UI, AI를 엔진 구조에 맞춰 배치한다. 각 클래스가 언제 생성되고 누가 참조하는지를 정해야 기능이 커져도 블루프린트와 C++ 책임이 섞이지 않는다.
- GameMode
승리 조건, spawn 규칙, match 흐름처럼 서버 권한 규칙을 둔다.
- Controller / AI
플레이어 입력은 Controller가, NPC 판단은 AI가 실행 명령으로 해석한다.
- Character
동, 점프, 전투 판정처럼 월드 안에서 복제될 행동을 가진다.
- UMG
HUD와 메뉴 UI는 게임 상태를 표시하고 입력 흐름을 Controller로 넘긴다.
- 데이터 기반:
아이템과 스탯은 DataAsset/DataTable로 분리해 조정 가능하게 만든다. 코드에는 규칙을, 데이터에는 수치와 목록을 남긴다.
- GDD·TDD 구현 확장:
C++로 기반 타입과 수명 주기를 만들고 블루프린트 자식에서 애니메이션, 이펙트, 수치를 빠르게 튜닝한다.
프로젝트 생성 및 기본 설정
기능 목록보다 플레이어 행동이 어떤 규칙을 거쳐 어떤 결과로 보이는지 먼저 그린다.
- Input
행동 명령
- State
값 갱신
- Rule
다음 상태 결정
- Feedback
변화 표시
| 순환 단계 | 맡는 일 | 확인 기준 |
|---|---|---|
| Input | 키보드, 마우스, 패드 입력을 명령으로 만든다 | 액션 이름과 입력 장치가 분리된다 |
| State | 체력, 점수, 진행도 같은 판단 값을 갱신한다 | 값의 소유 클래스가 분명하다 |
| Rule | 충돌, 승패, 보상 조건으로 다음 상태를 정한다 | 규칙과 표시 코드가 섞이지 않는다 |
| Feedback | UI, 이펙트, 사운드로 변화 결과를 돌려준다 | 플레이어가 상태 변화를 이해한다 |
가장 먼저 언리얼 엔진에서 새로운 프로젝트를 생성하고 기본적인 설정을 진행합니다.
새 프로젝트 생성
언리얼 엔진 런처 실행: 원하는 엔진 버전(예: 5.3, 5.4 등)을 선택하여 실행합니다.
새 프로젝트 생성: Games 탭에서 원하는 템플릿(Blank, First Person, Third Person 등)을 선택합니다.
- Blank: 가장 기본적인 빈 프로젝트로, 모든 것을 직접 구성하고자 할 때 유용합니다.
- First Person/Third Person: 기본적인 캐릭터 컨트롤러와 입력 설정이 되어 있어 빠르게 프로토타입을 만들 수 있습니다.
- Blueprint / C++: 프로젝트의 주 개발 언어를 선택합니다. C++ 기반 프로젝트는 블루프린트도 사용할 수 있습니다.
- Quality Preset:
Maximum또는Scalable중 선택합니다.Scalable은 다양한 하드웨어에 대응하기 용이합니다. - Target Platform:
Desktop또는Mobile등을 선택합니다. - Starter Content: 필요에 따라
With Starter Content를 선택하여 기본적인 에셋(재료)을 포함할 수 있습니다.
프로젝트 이름 및 위치 지정: 프로젝트 이름을 명확하게 지정하고 저장될 디렉토리를 선택합니다.
기본 프로젝트 설정 조정
에디터에서 Edit -> Project Settings를 통해 프로젝트 전반에 걸친 설정을 조정합니다.
-
Maps & Modes
Game Default Map: 게임 시작 시 로드될 기본 맵을 지정합니다.Default Game Mode: 게임 모드 클래스를 지정합니다.
- Engine - Input: 키 바인딩, 액션 매핑, 축 매핑 등을 설정합니다.
- Engine - Rendering: 렌더링 품질 설정, 나나이트/루멘 활성화/비활성화 등.
- Engine - Physics: 물리 시뮬레이션 설정, 콜리전 프로파일 등.
- Platforms: 대상 플랫폼별 설정 (모바일 앱 아이콘, 안드로이드 SDK 경로 등).
핵심 게임플레이 시스템 구현
GDD에 정의된 핵심 게임플레이 루프와 시스템을 언리얼 엔진의 구조에 맞춰 구현합니다.
게임 프레임워크 (Game Framework) 구성
언리얼 엔진은 게임의 기본 골격을 구성하는 프레임워크 클래스들을 제공합니다.
-
AGameModeBase/AGameMode- 게임의 규칙, 플레이어 접속/종료, 점수 계산, 게임 시작/종료 조건 등 게임의 전반적인 흐름을 관리합니다.
- 멀티플레이어 게임에서는 서버에서만 존재하고 실행됩니다 (
Server Authority). Default Pawn Class,PlayerController Class,HUD Class,PlayerState Class,GameState Class등을 지정합니다.
-
APlayerController- 플레이어의 입력(마우스, 키보드, 게임패드)을 받아
APawn또는ACharacter로 전달하고 제어합니다. - UI 상호작용, 카메라 제어 등 플레이어와 관련된 로직을 담당합니다.
- 멀티플레이어에서는 각 클라이언트에 하나씩 존재합니다.
- 플레이어의 입력(마우스, 키보드, 게임패드)을 받아
-
APawn/ACharacter- 게임 세계에 존재하는 물리적인 엔티티를 나타냅니다. 플레이어가 조작할 수 있는 대상을 의미합니다.
ACharacter는APawn의 특수한 형태로, 캡슐 콜리전, 이동 컴포넌트(CharacterMovementComponent) 등 사람 형태 캐릭터에 필요한 기능이 내장되어 있습니다.- 이동, 점프, 공격 등 캐릭터 고유의 행동 로직을 구현합니다.
-
APlayerState- 플레이어의 게임별 상태(점수, 이름, 남은 생명 등)를 저장하고 네트워크를 통해 동기화합니다.
- 서버와 모든 클라이언트에 존재합니다.
-
AGameStateBase/AGameState- 게임의 전역적인 상태(남은 시간, 팀 점수, 게임 단계 등)를 저장하고 네트워크를 통해 동기화합니다.
- 서버와 모든 클라이언트에 존재합니다.
구현 팁: 각 프레임워크 클래스는 C++로 기본 구현을 하고, 필요한 경우 블루프린트로 자식 클래스를 만들어 로직을 확장하는 것이 일반적입니다.
캐릭터 컨트롤 및 이동
ACharacter클래스를 상속받아 캐릭터 블루프린트 또는 C++ 클래스를 생성합니다.- 입력 매핑:
Project Settings->Input에서Action Mappings와Axis Mappings를 설정하고,SetupPlayerInputComponent함수에서 이를 캐릭터에 바인딩합니다. - 이동 구현:
AddMovementInput,AddControllerYawInput,AddControllerPitchInput등을 사용하여 캐릭터의 이동 및 시점 회전을 구현합니다. - 애니메이션:
UAnimInstance를 상속받는 애니메이션 블루프린트를 생성하여 캐릭터의 이동, 점프, 공격 등에 따른 애니메이션 스테이트 머신과 로직을 구현합니다.CharacterMovementComponent의 속성(속도, 점프 상태 등)을 활용합니다.
컴뱃 시스템 (전투 시스템)
-
공격 로직
- 입력(공격 버튼) 감지 시 애니메이션 몽타주 재생, 공격 판정 영역 활성화(콜리전) 등.
UAbilitySystemComponent(GAS): 복잡한 스킬, 버프, 디버프 시스템을 구현할 때 매우 강력한 프레임워크입니다. (Gameplay Ability System)
-
데미지 시스템
ApplyDamage,TakeDamage함수를 사용하여 데미지 계산 및 적용.GameplayEffect를 활용하여 데미지 타입, 속성 기반 데미지 등을 정의.
-
체력 / 스탯 시스템
UAttributeSet을 상속받아 체력, 마나, 공격력 등 캐릭터 스탯을 정의하고 관리합니다.GameplayEffect를 통해 스탯 변화를 적용합니다.
인벤토리 및 아이템 시스템
- 아이템 정의:
UDataAsset이나FTableRowBase를 상속받는DataTable을 사용하여 아이템의 속성(이름, 설명, 아이콘, 효과)을 정의합니다. - 인벤토리 관리:
TArray또는TMap을 사용하여 아이템 목록을 관리하는 컴포넌트(UInventoryComponent)를 생성하고, 아이템 추가/제거/사용 로직을 구현합니다. - UI 연동: UMG 위젯(
UUserWidget)을 사용하여 인벤토리 화면, 아이템 슬롯, 아이템 정보 창 등을 구현하고, 인벤토리 컴포넌트의 데이터와 연동합니다.
아이템 데이터의 C++ 로드/검증 흐름은 7장 3절에서 다룬 Data Asset / Data Table 패턴을 그대로 재사용할 수 있습니다.
UI/UX 구현
- UMG (Unreal Motion Graphics): 언리얼 엔진의 강력한 위젯 기반 UI 시스템입니다.
- 위젯 블루프린트 생성: HUD, 메인 메뉴, 인벤토리, 설정 창 등 필요한 UI 요소를 위젯 블루프린트로 만듭니다.
- 계층 구조:
Canvas Panel,Horizontal Box,Vertical Box,Grid Panel등을 사용하여 UI 레이아웃을 구성합니다. - 데이터 바인딩: 위젯에 표시될 데이터를 C++ 또는 블루프린트 변수에 바인딩하여 동적으로 업데이트합니다.
- 이벤트 처리: 버튼 클릭, 슬라이더 변경 등 사용자 입력에 대한 이벤트를 처리하고 게임 로직과 연동합니다.
- UI 컨트롤러:
APlayerController에서 UI 표시/숨김, 입력 모드 변경(게임 전용, UI 전용, 게임 및 UI) 등을 관리합니다.
AI 시스템 구현
- AI Controller:
AAIController를 상속받는 AI 컨트롤러 클래스를 생성하고,Default Pawn Class에 이 컨트롤러를 사용하도록 설정합니다. -
행동 트리 (Behavior Tree)
Behavior Tree에셋과Blackboard에셋을 생성합니다.- 블랙보드에 AI가 인지하고 추적할 데이터(목표 위치, 대상 액터, 현재 상태)의 키를 정의합니다.
- 행동 트리를 설계하여
Selector,Sequence,Decorator,Service,Task노드를 조합하여 AI의 행동 흐름을 정의합니다. - 커스텀 AI 행동이 필요하면
UBehaviorTreeTask_BlueprintBase를 상속받아 블루프린트 또는 C++로 커스텀 작업을 구현합니다.
- 내비게이션 메시:
Nav Mesh Bounds Volume을 레벨에 배치하여 AI가 이동할 수 있는 영역을 생성합니다. - AIPerceptionComponent: AI 컨트롤러에
AIPerceptionComponent를 추가하여 시각, 청각 등 AI의 인지 능력을 구현합니다.
아래 다이어그램은 핵심 게임플레이 시스템을 언리얼 프레임워크 클래스와 컴포넌트 단위로 연결해 구현 순서를 정리한 것입니다.
입력, 규칙, 상태, UI, AI를 한 그래프에 섞지 않고 언리얼 프레임워크 클래스와 컴포넌트 경계에 맞춰 나누면 구현 순서가 선명해집니다.
- 1구현 단위 맡길 책임 주의할
경계 검증 기준
- 2GameMode 승패, 스폰, 기본 클래스
지정, 서버 권한 규칙 클라이언트 UI 상태를 직접 들고 있지 않음 게임 시작과 종료 조건을 서버에서 재현
- 3PlayerController 입력, 카메라, UI
모드, Pawn 조작 의도 전달 캐릭터의 체력과 인벤토리를 직접 소유하지 않음 입력 변경이 Pawn 행동으로만 이어지는지 확인
- 4Character / Pawn 이동, 점프
공격 실행, 애니메이션 상태 갱신 재사용 가능한 기능은 컴포넌트로 분리 입력, 애니메이션, 충돌 판정이 한 루프로 동작
- 5Component / Data 인벤토리, 스탯
상호작용, Data Asset과 Data Table UI 표시와 저장 포맷을 같은 클래스에 섞지 않음 데이터 수정이 UI와 게임 규칙에 일관되게 반영
- 6Widget / AI UMG 피드백
AI Controller, Blackboard, Behavior Tree 표시와 판단은 상태 원본을 읽어 반응하게 둠 체력, 인지, 목표 변화가 화면과 행동에 반영
멀티플레이어 시스템 구현 (선택 사항)
멀티플레이어 게임을 개발한다면 언리얼 엔진의 강력한 네트워크 기능을 활용해야 합니다.
- 서버 권한 (Server Authority): 대부분의 중요한 게임 로직(데미지 계산, 아이템 획득, 이동 유효성 검사)은 서버에서 처리하여 치트를 방지합니다.
-
리플리케이션 (Replication)
UProperty에Replicated또는ReplicatedUsing키워드를 사용하여 변수를 네트워크 동기화합니다.UFunction에Server,Client,NetMulticast키워드를 사용하여 함수 호출을 네트워크 동기화합니다.DOREPLIFETIME매크로를 사용하여 복제할 변수를 명시합니다.
- RPC (Remote Procedure Call): 클라이언트가 서버에게, 또는 서버가 클라이언트에게 특정 함수를 실행하도록 요청하는 메커니즘입니다.
- 에셋 리플리케이션: 캐릭터 메시, 애니메이션, 파티클 등 시각적 에셋도 네트워크를 통해 동기화되어 모든 플레이어에게 동일하게 보여야 합니다.
- 랙 보상 (Lag Compensation): 지연 시간으로 인한 문제를 완화하기 위해 서버 측에서 클라이언트의 입력 시점을 예측하거나 되돌리는 기법을 적용합니다 (주로 FPS 게임).
- 매치메이킹 및 세션 관리:
Online Subsystem을 사용하여 스팀, 에픽 온라인 서비스, 콘솔 플랫폼의 매치메이킹 및 세션 기능을 통합합니다.
콘텐츠 통합 및 아트 파이프라인
게임 시스템이 구현됨에 따라, 아트/사운드 리소스를 통합하고 관리하는 파이프라인도 중요합니다.
- 에셋 임포트: 모델(FBX), 텍스처(TGA, PNG), 사운드(WAV, OGG), 애니메이션 등을 언리얼 엔진으로 임포트합니다.
- 머티리얼 설정: 임포트된 텍스처를 사용하여 PBR(물리 기반 렌더링) 원칙에 따라 머티리얼을 생성하고 오브젝트에 적용합니다.
- 레벨 디자인: 구현된 시스템과 에셋을 사용하여 레벨을 구성하고 라이팅을 설정합니다.
- 최적화: 9장에서 다룬 성능 최적화 기법(LOD, 텍스처 압축, 나나이트, 루멘 등)을 콘텐츠에 적용합니다.
디버깅 및 테스트
구현 단계에서 지속적인 디버깅과 테스트는 필수적입니다.
- 인게임 콘솔:
stat fps,stat unit,show collision등 디버그 명령어를 적극 활용합니다. - Visual Studio / Xcode 디버거: C++ 코드의 브레이크포인트, 변수 검사 등을 통해 문제를 해결합니다.
- 블루프린트 디버거: 블루프린트 로직의 실행 흐름과 변수 값을 추적합니다.
- 로그 시스템:
UE_LOG와Print String을 사용하여 중요한 정보나 오류 메시지를 출력하고 로그 파일을 검토합니다. - 유닛 테스트 / 통합 테스트: 특정 기능이나 시스템이 올바르게 작동하는지 자동화된 테스트를 작성합니다.
아래 다이어그램은 설계 문서를 실제 언리얼 프레임워크 클래스와 컴포넌트로 옮길 때 서버 권한, 데이터, 디버깅 기준을 함께 확인하는 흐름입니다.
게임 규칙, 입력, 상태, UI, AI, 네트워크를 어느 클래스와 컴포넌트가 맡는지 나누면 디버깅과 확장이 쉬워집니다.
| 시스템 | 주요 책임 | 권장 위치 | 확인할 위험 |
|---|---|---|---|
| 게임 규칙 승패와 스폰 | 승리 조건, 라운드, 스폰 정책 | GameMode와 GameState 분리 | 클라이언트가 서버 전용 규칙을 판단함 |
| 플레이어 입력 조작과 실행 | 입력 해석, UI 모드, 이동과 공격 실행 | PlayerController, Pawn, Character | 입력 처리와 상태 변경이 한 클래스에 몰림 |
| 데이터 시스템 수치와 설정 | 아이템, 능력, 밸런스 값 | DataAsset, DataTable, AttributeSet | 빌드 없는 조정 수치가 코드에 박혀 있지 않은지 확인 |
| AI와 이동 인지와 행동 | 목표 선택, 이동 경로, 행동 전환 | AIController, Blackboard, Behavior Tree | Nav Mesh와 목표 위치 기준이 어긋남 |
| 멀티플레이 동기화 | 데미지, 획득, 승패, 상태 복제 | 서버 권한, Replication, RPC | 권한 혼재 클라이언트가 중요한 판정을 확정함 |
아래 다이어그램은 입력에서 Actor, 데이터, 피드백, 네트워크, 테스트까지 기능 하나를 세로로 완성하는 구현 흐름입니다.
기능 하나는 입력, Actor, 데이터, 피드백, 네트워크, 테스트가 한 줄로 이어질 때 실제 게임 시스템이 됩니다.
- Input
키, 클릭, AI 요청이 명령으로 들어옵니다.
- Actor
Character, Controller, Component가 실행 책임을 나눕니다.
- Data
Asset, SaveGame, State에 상태를 둡니다.
- Feedback
UI, 사운드, 이펙트로 결과를 즉시 보여줍니다.
- Network
서버 권한과 복제 변수의 경계를 정합니다.
- Test
그, 디버거, 자동 테스트로 회귀를 막습니다.
게임 시스템 구현은 기획과 설계를 현실로 만드는 과정입니다.
언리얼 엔진의 프레임워크 클래스, 캐릭터 컨트롤, 컴뱃, 인벤토리, UI, AI, 멀티플레이어 시스템 구현 방법을 이해하고 활용하는 것이 중요합니다.
또한, 아트 리소스 통합 및 최적화, 그리고 개발 단계 전반에 걸친 지속적인 디버깅과 테스트는 게임의 품질을 확보하는 데 필수적입니다.
게임 시스템 구현에서는 프레임워크 클래스, 컨트롤, 컴뱃, 인벤토리, UI, AI, 멀티플레이어 역할을 나누어 구현하고 반복 테스트해야 합니다.
설계 문서의 문장을 실제 언리얼 클래스와 시스템 구현으로 옮길 때의 연결 기준을 마지막으로 묶어 보겠습니다.
기능을 많이 붙이기보다 어떤 클래스가 어떤 상태를 소유하는지 유지해야 완성도가 빨리 오른다.
| 구현 단계 | 먼저 고정할 것 | 완료 신호 |
|---|---|---|
| Rules | GameMode, GameState, PlayerController의 책임 | 점수와 진행 상태의 위치가 정해진다 |
| Character | 이동, 카메라, 입력 처리의 기준선 | 전투와 상호작용을 붙일 몸체가 안정된다 |
| Content | 아이템, UI, AI, 아트 리소스의 데이터 흐름 | 표시 위치와 소유 데이터가 일치한다 |
| QA | 플레이 테스트, 로그, 자동 테스트 후보 | 새 시스템마다 회귀 확인 경로가 있다 |