Unreal Engine 5 게임 루프 및 UI 재설계하기

조정원·2025년 7월 25일
post-thumbnail

TIL(Today I Learned)

이번 과제는 자신만의 레벨과 게임의 흐름을 설계하고, UI/UX요소를 다듬어 보는 것이다.

강의에서 만든 게임은 아래와 같이 지뢰를 피해 일정 시간 내에 코인을 모으는 게임이다.

이 게임을 기반으로 어떤 게임을 만들까 생각하던 중 지뢰를 몬스터 스포너로 대체하여 귀신처럼 등장하면 재밌겠다고 생각했다.
1인칭 Horror 템플릿을 활용해서 캐릭터의 시야를 한정하여 공포스러운 분위기를 주었다.
추가한 기능은 다음 같다.

랜덤 스폰너(충돌 시 재생성)
HUD 애니메이션
HP UI
Monster AI (Patrol / Chase / Attack)

시연 영상

이 글에서는 배운 내용 중 게임의 전반적인 흐름을 담당하는 클래스들을 정리해보면 좋을것같다.
액터와 캐릭터에 몇가지 상호작용을 추가하여 게임의 일부를 만들어본적은 있지만,
전반적인 게임의 흐름을 구성해서 완성된 게임으로 만들어본 것은 처음이다.

1. Character

Character는 Pawn의 자식 클래스이며, 보행형 캐릭터 구현에 최적화된 기본 클래스이다.
내부에 UCharacterMovementComponent를 포함하고 있어, 복잡한 움직임 구현 없이도 걷기, 뛰기, 점프, 회전, 중력 처리 등이 자동으로 동작한다.

Character의 주요 특징
기본 이동 기능 내장

  • MoveForward(), MoveRight(), Jump() 같은 함수가 기본으로 탑재되어 있음.
  • 최소한의 코드만 작성해도 테스트가 가능함.

물리 기반 이동 + 네트워크 동기화

  • 중력, 슬로프 대응, 점프 등 물리 기반의 자연스러운 이동 지원.
  • 멀티플레이를 고려한 네트워크 동기화 기능도 포함됨.

사람형 캐릭터에 특화

  • 보행자 형태의 캐릭터를 만들 때 빠르고 안정적으로 구현 가능.
  • Skeletal Mesh, Animation Blueprint와의 연동도 자연스러움.

2. PlayerController

PlayerController는 플레이어의 입력(키보드, 마우스, 게임패드 등)을 받아 이를 해석하고, 해당 명령을 Character나 Pawn에 전달하는 핵심 클래스다.
입력 처리와 캐릭터의 행동 로직을 분리하여 구조적인 코드 작성이 가능하도록 설계된 언리얼 엔진의 중심 개념이다.
멀티플레이 환경에서는 각 플레이어마다 고유한 PlayerController 인스턴스가 생성되어, 입력을 안전하게 분리한다.

입력 처리 흐름
입력 장치에서 입력 발생

  • PlayerController가 입력을 감지하고 해석
  • 해당 Pawn 또는 Character에 명령 전달 (이동, 회전, 공격 등)

PlayerController의 주요 기능
입력 처리

  • SetupInputComponent()에서 키보드/마우스 입력을 바인딩
  • 언리얼 5의 Enhanced Input 시스템을 사용하면 액션 기반의 입력 처리를 체계화 가능
  • 블루프린트 또는 C++ 모두 구현 가능

카메라 제어

  • 축 입력(마우스, 게임패드) 등을 이용한 시점 회전, 줌, 카메라 스위칭 등 제어 가능

UI(HUD)와의 상호작용

  • 버튼 클릭, 인벤토리 열기 등 UI 입력 처리의 중간 다리 역할
  • UI에서 발생한 이벤트를 GameMode, Character 등에 전달하는 입력 해석자

Possess / UnPossess

  • 특정 Pawn에 빙의(Possess) 하여 해당 캐릭터를 조작
  • UnPossess()로 제어 중단 후 다른 Pawn으로 전환 가능
  • 멀티플레이에서도 각 PlayerController가 고유 Pawn을 제어

3. GameMode

게임의 규칙과 흐름을 총괄 관리하는 클래스이며, 싱글플레이에서는 로컬에서만 동작한다.
플레이어에게 어떤 캐릭터를 스폰할지, 어떤 컨트롤러를 사용할지, 승패 조건이나 점수 계산은 어떻게 할지를 결정한다.
레벨마다 다른 GameMode를 설정하여 상황별 게임 진행 방식을 제어할 수 있다.

GameMode의 주요 기능
Pawn/Character 스폰

  • DefaultPawnClass 또는 커스텀 캐릭터를 플레이어 입장 시 자동 생성하고 연결

PlayerController 지정

  • 플레이어 입력을 처리할 PlayerController 클래스를 정의

게임 규칙 및 흐름 관리

  • 점수, 타이머, 라운드, 난이도 설정 등 게임 진행 전반을 통제
  • 승리/패배 조건을 판단하고 그에 따른 후속 처리를 수행

GameState / PlayerState와의 연동

  • GameState: 타이머, 전체 점수 등 전역 상태 관리.
  • PlayerState: 각 플레이어의 개별 상태(예: 체력, 점수 등) 저장 및 관리.
  • 싱글플레이에서도 게임 상태를 구조적으로 관리하고자 할 때 유용

4. GameState

GameState는 현재 게임의 전역 상태 정보(게임 진행 상황, 타이머, 점수 등)를 저장하고, 클라이언트와 동기화해주는 클래스이다.
GameMode가 서버 전용으로 로직을 관리하는 반면, GameState는 서버와 클라이언트 모두에서 존재하며, 클라이언트가 게임 상태를 알 수 있게 도와줍니다.
주로 UI, HUD, 애니메이션, 판정 처리 등에서 현재 게임 상태를 참조할 때 사용한다.

GameState의 주요 기능
게임 진행 정보 관리

  • 게임 시간, 라운드 진행률, 남은 적 수, 점수 등 전체 게임의 상태 정보를 저장한다.

서버 → 클라이언트 동기화

  • GameMode에서 업데이트한 상태 정보는 GameState를 통해 클라이언트에 자동 동기화된다.
  • 예: 서버에서 점수 증가 → GameState 갱신 → 클라이언트 UI 자동 반영

PlayerState 집합 보관

  • 각 플레이어의 상태를 담고 있는 PlayerState 객체들을 배열 형태로 보유하고 있어, 여러 플레이어의 상태를 참조할 수 있다.

5. GameInstance

GameInstance는 게임 실행 시 생성되어, 레벨 전환 간에도 유지되는 유일한 클래스다.
주로 게임 전역에서 공유해야 하는 데이터(예: 로그인 정보, 설정, 선택한 캐릭터 등)를 저장하며, 세션을 넘나드는 지속성 있는 상태 관리에 사용된다.

GameInstance의 주요 기능
전역 데이터 저장

  • 레벨을 넘어 공유해야 하는 정보 저장 (예: 플레이어 이름, 서버 주소, 선택한 캐릭터 ID 등)
  • 메뉴 → 인게임으로 넘어갈 때 필요한 정보 전달에 매우 유용

레벨 전환에도 파괴되지 않음

  • GameMode, GameState, PlayerController, Character 등은 레벨마다 새로 생성되지만,
  • GameInstance는 게임을 종료하기 전까지 유지되므로 전역 컨트롤러 역할을 수행한다.

게임 구조 초기화 및 관리

  • 초기 설정, 서버 연결, 로딩 등 게임 실행 흐름의 첫 단계를 관리할 수 있음
  • 커스텀 GameInstance 클래스를 만들어 설정 관리, 통계 수집, 오류 리포트 등에도 활용 가능
profile
게임 AI 개발자 조정원입니다.

0개의 댓글