안동민 개발노트

본문 시작

게임 시스템 구현

게임 프레임워크를 바탕으로 캐릭터·전투·인벤토리·UI·AI 시스템을 단계별로 통합합니다.

이전 절에서 우리는 게임 프로젝트의 성공적인 시작을 위한 기획과 설계의 중요성에 대해 알아보았습니다.

명확한 GDD(게임 디자인 문서)와 TDD(기술 설계 문서)는 개발의 길잡이가 되며, 이제 이 설계도를 바탕으로 언리얼 엔진에서 실제로 게임 시스템을 구현하는 단계에 돌입할 차례입니다.

이 절에서는 언리얼 엔진의 핵심 기능을 활용하여 게임의 주요 시스템을 어떻게 구현할 것인지에 대한 구체적인 방법론을 제시합니다.


프로젝트 생성 및 기본 설정

가장 먼저 언리얼 엔진에서 새로운 프로젝트를 생성하고 기본적인 설정을 진행합니다.

새 프로젝트 생성

언리얼 엔진 런처 실행: 원하는 엔진 버전(예: 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: 게임 모드 클래스를 지정합니다.
  • 입력: Enhanced Input을 쓰는 프로젝트는 Input Action·Input Mapping Context와 Local Player Subsystem 등록을 맞춥니다. Engine - Input의 기존 Action/Axis Mapping 방식과 구분합니다.
  • 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 상호작용, 카메라 제어 등 플레이어와 관련된 로직을 담당합니다.
    • 서버에는 각 연결 플레이어의 Controller가 있고, 클라이언트에는 자신이 소유한 로컬 플레이어의 Controller가 있습니다. 분할 화면은 로컬 플레이어가 여러 명일 수 있습니다.
  • APawn / ACharacter
    • 게임 세계에 존재하는 물리적인 엔티티를 나타냅니다. 플레이어가 조작할 수 있는 대상을 의미합니다.
    • ACharacter는 APawn의 특수한 형태로, 캡슐 콜리전, 이동 컴포넌트(CharacterMovementComponent) 등 사람 형태 캐릭터에 필요한 기능이 내장되어 있습니다.
    • 이동, 점프, 공격 등 캐릭터 고유의 행동 로직을 구현합니다.
  • APlayerState
    • 플레이어의 게임별 상태(점수, 이름, 남은 생명 등)를 저장하고 네트워크를 통해 동기화합니다.
    • 서버와 모든 클라이언트에 존재합니다.
  • AGameStateBase / AGameState
    • 게임의 전역적인 상태(남은 시간, 팀 점수, 게임 단계 등)를 저장하고 네트워크를 통해 동기화합니다.
    • 서버와 모든 클라이언트에 존재합니다.

구현 팁: 각 프레임워크 클래스는 C++로 기본 구현을 하고, 필요한 경우 블루프린트로 자식 클래스를 만들어 로직을 확장하는 것이 일반적입니다.

캐릭터 컨트롤 및 이동

  • ACharacter 클래스를 상속받아 캐릭터 블루프린트 또는 C++ 클래스를 생성합니다.
  • 입력 매핑: Enhanced Input에서는 Input Action·Mapping Context를 만들고 소유 Local Player에 Context를 추가합니다. SetupPlayerInputComponent에서 UEnhancedInputComponent에 액션을 바인딩합니다. 기존 입력 방식이라면 Project Settings의 Action/Axis Mapping과 해당 바인딩 API를 사용합니다.
  • 이동 구현: AddMovementInput, AddControllerYawInput, AddControllerPitchInput 등을 사용하여 캐릭터의 이동 및 시점 회전을 구현합니다.
  • 애니메이션: UAnimInstance를 상속받는 애니메이션 블루프린트를 생성하여 캐릭터의 이동, 점프, 공격 등에 따른 애니메이션 스테이트 머신과 로직을 구현합니다. CharacterMovementComponent의 속성(속도, 점프 상태 등)을 활용합니다.

컴뱃 시스템 (전투 시스템)

  • 공격 로직
    • 입력(공격 버튼) 감지 시 애니메이션 몽타주 재생, 공격 판정 영역 활성화(콜리전) 등.
    • UAbilitySystemComponent (GAS): 복잡한 스킬, 버프, 디버프 시스템을 구현할 때 매우 강력한 프레임워크입니다. (Gameplay Ability System)
  • 데미지 시스템
    • ApplyDamage, TakeDamage 함수를 사용하여 데미지 계산 및 적용.
    • GameplayEffect를 활용하여 데미지 타입, 속성 기반 데미지 등을 정의.
  • 체력 / 스탯 시스템
    • UAttributeSet을 상속받아 체력, 마나, 공격력 등 캐릭터 스탯을 정의하고 관리합니다.
    • GameplayEffect를 통해 스탯 변화를 적용합니다.

인벤토리 및 아이템 시스템

  • 아이템 정의: UDataAsset 파생 에셋이나 FTableRowBase 파생 USTRUCT를 Row Struct로 사용하는 UDataTable을 통해 아이템의 속성(이름, 설명, 아이콘, 효과)을 정의합니다.
  • 인벤토리 관리: TArray 또는 TMap을 사용하여 아이템 목록을 관리하는 컴포넌트(UInventoryComponent)를 생성하고, 아이템 추가/제거/사용 로직을 구현합니다.
  • UI 연동: UMG 위젯(UUserWidget)을 사용하여 인벤토리 화면, 아이템 슬롯, 아이템 정보 창 등을 구현하고, 인벤토리 컴포넌트의 데이터와 연동합니다.

아이템 데이터의 C++ 로드/검증 흐름은 7장 3절의 일반 파일·JSON 처리와 구분해야 합니다. UDataAsset·UDataTable 에셋 로딩은 엔진의 에셋 참조·로드 경로를 사용합니다.

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 컨트롤러 클래스를 생성하고, 대상 Pawn의 AI Controller Class와 Auto Possess AI 조건을 설정하고, 소유 후 Behavior Tree를 실행합니다.
  • 행동 트리 (Behavior Tree)
    • Behavior Tree 에셋과 Blackboard 에셋을 생성합니다.
    • 블랙보드에 AI가 인지하고 추적할 데이터(목표 위치, 대상 액터, 현재 상태)의 키를 정의합니다.
    • 행동 트리를 설계하여 Selector, Sequence, Decorator, Service, Task 노드를 조합하여 AI의 행동 흐름을 정의합니다.
    • 커스텀 AI 행동이 필요하면 Blueprint에서는 UBTTask_BlueprintBase, native C++에서는 UBTTaskNode 등을 상속하여 커스텀 작업을 구현합니다.
  • 내비게이션 메시: Nav Mesh Bounds Volume을 레벨에 배치하여 AI가 이동할 수 있는 영역을 생성합니다.
  • AIPerceptionComponent: AI 컨트롤러에 AIPerceptionComponent를 추가하여 시각, 청각 등 AI의 인지 능력을 구현합니다.

멀티플레이어 시스템 구현 (선택 사항)

멀티플레이어 게임을 개발한다면 언리얼 엔진의 강력한 네트워크 기능을 활용해야 합니다.

  • 서버 권한 (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, 멀티플레이어 시스템 구현 방법을 이해하고 활용하는 것이 중요합니다.

또한, 아트 리소스 통합 및 최적화, 그리고 개발 단계 전반에 걸친 지속적인 디버깅과 테스트는 게임의 품질을 확보하는 데 필수적입니다.

게임 시스템 구현에서는 프레임워크 클래스, 컨트롤, 컴뱃, 인벤토리, UI, AI, 멀티플레이어 역할을 나누어 구현하고 반복 테스트해야 합니다.

상태·동작기준 위치네트워크에서 확인할 점
승패·스폰 규칙서버 GameMode클라이언트가 직접 확정하지 않음
공유 진행 상태GameState·PlayerState필요한 복제·권한을 명시
입력·로컬 UI소유 PlayerController다른 플레이어 Controller와 혼동하지 않음
월드 행동Pawn·Character·Component이동·공격·표현 상태의 책임 분리
아이템 정의DataAsset·DataTable정의 에셋과 변하는 인벤토리 상태 구분

기능 하나를 입력→권한 확인→상태 변경→화면 피드백까지 연결한 뒤 범위를 넓힙니다. 복제 속성 등록 외에도 Actor/Component 복제 활성화, RPC 소유권·호출 방향·relevancy를 확인합니다.