[UE5] Unreal Engine 5 길라잡이 - 7. 게임 모드

세동네·2022년 6월 23일
1
post-thumbnail

이 시리즈는 이득우의 언리얼 C++ 게임 개발의 정석을 바탕으로 작성되었습니다.

언리얼 엔진의 게임플레이 프레임워크는 미리 완성해둔 레벨에 규칙을 부여하고 레벨에서 활동할 액터를 배치한다. 이때 규칙을 '게임 모드', 배치한 액터 중 플레이어가 직접 조종할 수 있는 액터를 '폰'이라 한다.

· 게임 모드

게임 모드(Game Mode)는 게임의 규칙을 결정하고 정보를 처리하는 액터다. 게임 모드가 결정하는 규칙의 예시는 다음과 같다.

  • 플레이어가 게임에 들어오는 방식, 스폰 위치 선택 규칙과 기타 스폰/리스폰 동작 포함 가능
  • 액터간의 상호작용 처리
  • 존재하는 플레이어와 관람자의 수는 물론, 허용된 플레이어와 관람자 최대 수
  • 게임 일시정지 가능 여부, 게임 일시정지 처리 방식
  • 레벨간의 전환, 게임의 시네마틱 모드 시작 여부 포함

이러한 게임 모드에서 관리하는 규칙의 특징은 게임 중에 변하지 않을 정보들이라는 것이다. 자주 혹은 종종 변경될 수 있는 정보는 게임 모드에서 관리하지 않는 것이 좋다. 또한 게임 형식, 미션 유형, 특별 지역 규칙 등(예를 들어 하나의 FPS 게임 내에 데스매치, 폭파 임무, 점령전 등이 있는 식)에 따라 AGameModeBase의 서브클래스를 생성할 수 있다. 한 게임에 여러 게임 모드가 있을 수 있지만, 한 번에 하나의 게임 모드만 사용할 수 있다.

  • AGameModeBase

    UE 4.14 버전부터 AGameModeBase가 도입되었다. 이는 모든 게임 모드의 베이스 클래스로, 고전 AGameMode 클래스를 단순화하고 효율화시킨 버전이다. 4.14 이전의 게임 모드 베이스 클래스였던 AGameMode는 기능도 그대로이고 사용하는 방법도 똑같지만 이젠 AGameModeBase의 자손이 되었다.

    AGameMode는 경기 상태 개념 구현 방식상 멀티플레이어 슈팅 게임과 같은 유형에 보다 적합하다. EnteringMap(맵 진입), WaitingToStart(시작 대기 중), InProgress(진행 중), WaitingPostMatch(경기 후 대기) 등 경기 상태에 대한 부가 함수를 지원하며, 자세한 내용은 [UE Document] 게임 모드와 게임 스테이트의 'AGameMode' 항목에 자세히 나와 있다.

현재 프로젝트가 어떤 게임 모드를 따르고 있는지는 언리얼 에디터의 상단 툴바 [편집 - 프로젝트 세팅 - 프로젝트 - 맵 & 모드] 윈도우를 열어 확인할 수 있다.

기본적으로 GameModeBase라는 게임 모드가 선택되어 있으며, 사용자가 직접 게임 모드를 지정해줄 수 있다. 또한 선택된 게임 모드에 따라 게임을 구성하는 다양한 클래스를 커스텀하여 지정해줄 수 있는데, 각 클래스의 역할은 다음과 같다.

- 디폴트 폰 클래스

  • 폰(Pawn)
    우선 '폰'이라는 것이 무엇인지 먼저 알아야 할 필요가 있다. 폰은 컨트롤러로 조종 가능한 액터를 말한다.

    게임플레이 모드에 진입하면 디폴트 폰 클래스로 설정된 폰이 스폰되고, 컨트롤러에 빙의(Possess)된다. 이는 플레이어가 직접 조종하는 플레이어 컨트롤러일 수도 있고, 컴퓨터가 조종하는 AI 컨트롤러일 수도 있다.

    게임 유형에 따라 폰은 메시 컴포넌트를 보유하지 않아 그 형태를 볼 수 없을 수도 있다. 예를 들어 보드게임 장르가 있을 것이다. 그런 경우에도 폰 클래스는 트랜스폼을 가진다.

    특별히 사람과 같이 걸어다니는 형태의 폰을 캐릭터(Character)라 한다.

- 플레이어 컨트롤러 클래스

  • 컨트롤러(Controller)
    폰 또는 캐릭터(이하 폰)를 직접 제어하는 클래스를 말한다. 하나의 컨트롤러는 하나의 폰만 조종할 수 있기 때문에 폰에 빙의(Possess)된다고 한다. 플레이어가 직접 조종하는 플레이어 컨트롤러, 컴퓨터가 조종하는 AI 컨트롤러로 구분된다.

    플레이어 컨트롤러의 경우 플레이어의 입력을 폰이 직접 받는 것이 아니라, 플레이어 컨트롤러가 입력을 받고 폰에게 적절한 행동을 하도록 명령을 내린다. AI 컨트롤러도 같은 방식으로 정해진 로직에 따라 폰이 아닌 AI 컨트롤러에게 해야 할 행동을 알려주면 컨트롤러가 폰을 직접 움직인다.

    컨트롤러는 제어 중인 폰에 발생하는 이벤트를 가로채 폰의 기본 반응을 대체하는 반응을 설정할 수 있다. 또한, 전략 시뮬레이션과 같이 게임 유형에 따라 한 컨트롤러가 여러 폰을 제어해야 하는 상황이 있을 수 있는데, 이는 약간의 조정으로 해결이 가능하다.

    컨트롤러는 상황에 따라 폰을 옮겨다닐 수 있지만, 플레이어는 자신이 배정 받은 플레이어 컨트롤러를 변경할 수 없다.

플레이어 컨트롤러는 제어할 폰 클래스에 빙의되고 HUD, 입력 컨트롤, PlayerCameraManager를 설정한다. PlayerCameraManager는 플레이어의 눈이 되어주며 월드를 플레이어에게 보여줄 카메라 액터를 선택한다. 입력 컨트롤을 폰과 카메라에 동시에 전달해 각각의 회전을 컨트롤할 수 있다.

- HUD 클래스

  • HUD(Head-Up Display)
    HUD는 원래 비행기나 자동차 앞 유리에 정보를 표시해주는 증강현실 장치를 칭하는 말이지만, 게임에서 플레이어의 상태나 정보를 화면 위에 겹쳐놓이는 기본적인 인터페이스를 뜻하기도 한다.

    위 스크린샷의 양끝 하단에 있는 에너지, 미니맵, 아이템 등의 인터페이스 요소와 같은 것들을 말한다.

    언리얼 시스템에선 상호작용이 불가능한(클릭할 수 없는) 인터페이스 요소들만 HUD라고 하지만, UE4부터 등장한 UMG(Unreal Motion Graphic)이라는 UI 제작 툴이 개발된 이후로 상호작용 가능한 일부 요소도 HUD에 포함시킨다.

HUD 클래스는 Head-Up Display의 기초 클래스로, AHUD라는 클래스명으로 정의되어 있다. 하지만 앞선 HUD의 설명에서 말한 것처럼 UE4부터 등장한 UMG 툴이 훨씬 많은 장점을 가지고 있어 HUD 클래스보다 UMG의 사용이 권장되고 있다. 그럼에도 아직 HUD 클래스가 남아 있는 이유는 이전 버전 시스템과의 호환 즉, 레거시(Legacy) 때문이다.

일부 UMG에는 없는 장점을 HUD 클래스가 가지고 있긴 하지만, 일반적으로 UMG가 더 우수하다. HUD 클래스와 UMG는 완전히 독립되어 수행되는 UI이므로 둘을 동시에 사용한다고 충돌이 일어나진 않는다.

- 게임 스테이트 클래스

  • 게임 스테이트(Game State)
    게임에 참여하는 모두에게 적용되고 게임 중에 변하지 않을 규칙을 게임 모드에 저장하였다면, 게임에 규칙 관련 이벤트가 발생하고 트래킹을 통해 정보를 모든 플레이어가 공유할 필요가 있을 때, 그 정보는 게임 스테이트에 보관되고 그를 통해 동기화된다. 그 정보의 예시는 다음과 같다.

    • 게임 실행 기간 (로컬 플레이어 참가 전 실행 시간 포함).
    • 접속한 플레이어 목록, 각 플레이어의 게임 참가 기간, 현재 상태.
    • 오픈 월드 게임에서 완료한 미션 목록.
    • 현재 게임 모드의 베이스 클래스.
    • 게임 시작 여부.

    게임 스테이트는 클라이언트가 게임의 상태를 모니터링할 수 있도록 해준다. 플레이어 개개인이 아닌 접속한 모든 클라이언트가 알아야 하는 정보, 게임 모드에 관련된 게임 전반적인 프로퍼티 기록을 유지할 수 있다.

    AGameStateBase가 기본 구현이며, 게임에서 무슨 일이 벌어지고 있는지 플레이어에게 지속적으로 알리기 위해 필요한 변수와 함수를 넣기 위해 C++ 또는 블루프린트로 자주 확장시키는 클래스이다.

    게임 모드는 서버에만 존재하지만 게임 스테이트는 서버에 존재하면서 모든 클라이언트에 리플리케이트되어, 연결된 모든 기기의 게임 최신 상태를 유지한다.

- 플레이어 스테이트 클래스

  • 플레이어 스테이트(Player State)
    플레이어 개인의 정보를 관리하기 위한 클래스이다. 예를 들어 FPS 게임에서 팀 킬 스코어 중 특정 플레이어의 킬 스코어가 몇 점인지와 같은 개별 플레이어의 기록을 이곳에 저장한다.

    게임 스테이트와 혼동할 수 있는데, 일반적으로 게임 스테이트는 게임플레이 도중 변하면서 '모두에게' 관련이 있고 보일 수 있는 프로퍼티 기록을 유지해야 한다. 반면에 플레이어 스테이트는 '개인의' 정보를 관리한다.

- 관전자 클래스

  • 관전자 클래스(Spectator class)는 관람자/관중 클래스라고도 하며, 플레이어가 게임의 직접 참여자가 아닌 관중의 역할로 있을 때 무중력 비행 동작 등 관람에 이상적인 단순한 프레임워크를 제공한다.

· 플레이어의 입장 과정

게임 모드에 지정된 클래스들로 플레이어는

  1. 플레이어 컨트롤러 초기화
  2. 플레이어가 월드에 입장하기 위한 세팅 시작
  3. 폰 초기화
  4. 플레이어 컨트롤러 폰에 빙의
  5. 플레이어가 월드에 입장하기 위한 세팅 완료

의 과정을 거쳐 게임 월드에 참여하게 된다.

· 게임 모드 오버라이딩

프로젝트 세팅 윈도우에서 설정한 게임 모드는 모든 레벨에 기본으로 적용되지만, 특정 레벨에만 특별한 게임 모드를 적용하고 싶다면 다른 게임 모드를 적용할 레벨을 열고 언리얼 에디터의 상단 툴바 [ - 액터 배치] 패널을 열어 게임 모드를 오버라이딩 해줄 수 있다.


· 참고

[UE Document] 게임플레이 프레임워크
Unreal Engine UMG, HUD, Slate
[UE Document] 유저 인터페이스와 HUD

0개의 댓글