언리얼 - GameMode 기본 Class 구조

언리얼 프로젝트에서 튜토리얼로 Third Person 이 있다.

한국어로는 삼인칭 이름을 선택하고 프로젝트를 생성


Third Person 블루프린트

  • Third Person 의 기본 구조에서 블루프린트가 두개 있다.
  • +Add 버튼을 눌러 신규 블루프린트를 생성할 수 있다.

이 블루프린트가 어떻게 되어있는지 새로 하나씩 만들어보면서 알아보자.

신규 블루프린트로 "Game Mode Base"로 선택하여 "BP_GameMode" 이름으로 블루프린트를 만들어주자.

이 게임 모드는 서버만 가질 수 있는 모드이다.

현재 열려있는 게임 월드를 블루프린트로 생성한 BP_GameMode로 설정할 필요가 있다.

  • Windows -> World Settings 열여준다.
  • 우측 하단의 GameMode Override 블루프린트를 생성한 BP_GameMode 지정한다.

GameMode 멤버 필드와 멤버 함수

먼저 해당 생성한 BP_GameMode 를 열어주도록 한다.

  • 성공적으로 블루프린트를 열었다면 좌측 레이아웃 톱니바퀴를 선택한다.
  • 톱니바퀴로 펼쳐핀 "Show Inherited Variables" 를 선택한다.
    • 선택한 경우 상속한 Actor, GameMode Base 등등 멤버 함수와 멤버 필드를 에디터에서 표시해준다.
  • 다음으로 Game Mode 를 선택해 멤버 필드를 살펴본다.
  • Game Mode 에서 여러가지 옵션과 설정 부분이 있다는 것을 볼 수 있다.
    • 게임의 여러가지 영향을 끼치는 옵션들이다.
  • Use Seamless Travel 은 이동과 관련된 변수이다.
  • Game Net Driver Replication System 은 네트워크 레플리케이션 시스템 드라이버를 선택할 수 있다.
    • 설정하려면 우측 레이아웃에서 Default Value 드롭박스로 선택할 수 있다.
    • Default, Generic, Iris 네트워크 시스템을 무엇을 쓸 것인지 정할 수 있다.

  • FUNCTION 우측의 Override 선택하면 멤버 함수를 어떤 것을 사용할지 목록이 나열된다.
  • Game Mode 멤버 함수들을 살펴보면 게임과 관련된 이름들이 몇몇 있다.
    • Find Player Start 이름만 봐도 모드가 스폰되어 플레이어가 시작하는 타이밍에 함수를 실행하는 것으로 보인다.
    • OnLogout, OnPostLogin, OnRestartPlayer 로그인하거나 로그아웃 플레이어가 재시작하는 타이밍에 함수를 구동하는 것으로 보인다.
  • Game Mode 는 게임에 진행이나 연출 및 역할과 연관이 크다.

참고로 클라이언트는 게임 모드에 접근할 수 없다.

  • 월드 세팅에서 보았겠지만 게임 모드는 정의된 클래스들을 연결해 선택할 수 있다.
  • Variables > Classes 클래스 멤버 필드를 볼 수 있다.
  • Components 의 BP_GameMode 선택해도 우측의 Details 레이아웃에서 특정 Classess 실제로 선택할 수 있다.

GameMode Classes 만들어 설정하기

앞단에서 이미 설명을 했지만 게임모드에서 정의된 Classes 를 선택할 수 있다.
이제부터 새로운 Classes 블루프린트를 만들고 선택해보도록 하겠다.

먼저 무엇부터 할지 살펴보자.

  • 앞서 World Settings 에서 BP_GameMode 선택한 부분이 있다
  • Selected GameMode 에서 Class를 선택하는 항목들이 각각 있다.
    • Default Pawn Class 는 이미 생성된 "BP_ThirdPersonCharacter" Pawn 상속클래스를 선택해주자.
    • Player Controller Class 입력과 관련된 컨트롤러이다. 우리는 컨트롤러 블루프린트를 만들어 게임모드로 설정해주도록 하겠다.

  • 신규 블루프린트로 Player Controller 클래스로 생성한다.
  • 블루프린트 이름을 "BP_PlayerController" 로 선택한다.

  • World Settings 에서 새로 만든 "BP_PlayerController" 선택 할 수 있다.

BP_PlayerController 멤버 필드와 멤버 함수

BP_PlayerController 블루프린트도 마찬가지로 상속한 멤버 필드와 멤버 함수를 살펴보자.

  • VARIABLES 에는 카메라와 연관된 멤버 필드들을 살펴 볼 수 있다.
  • FUNCTION의 Override에는 멤버함수를 살펴볼 수 있는데 On Prosses, On UnPosses, Receive Instigated Any Damage 등이 있다.
    • Posses 는 이전에 말했다시피 플레이어 컨트롤러로 Pawn을 움직일 수 있게 빙의한다.

플레이어 컨트롤러는 싱글게임에서 인풋처리를 위한 것이지만 온라인 게임이나 멀티 게임으로 만든 경우 이야기가 달라진다.
플레이어 컨트롤러로 온라인으로 서버와 클라이언트를 통신하는 중요한 클래스이다.
즉, 서버와 클라이언트 통신의 창구의 역할을 해준다.

이 이야기를 하는 이유는 싱글게임에서 Pawn 클래스에게 PlayerController 컴포넌트로 의존되게 개발하기도 하다. 하지만 온라인에서는 올바르게 동작 되지 않을 것이다. Pawn 클래스와 PlayerController 서로 분리해야한다.


Game State 멤버 필드와 스테이트

게임 스테이트는 대시보드 역할로 게임의 전체적인 진행 상황을 알 수 있도록 해줍니다.
게임에서는 유니크한 모드이므로 모든 플레이가 똑같은 화면을 표시해줍니다.

먼저 Game State 블루프린트를 생성합니다.

  • Content 에서 +Add 버튼으로 신규 블루프린트를 생성하기
  • ALL CLASSES에서 GameStateBase 선택하여 생성하기

  • 생성한 블루프린트는 Content에서 파일명은 BP_GameState 으로 변경합니다.

  • 블루프린트에서 VARIABLES 상속한 Game State 변수들이 나열되어있음
  • Player Array 변수는 게임 전광판에서 플레이어들이 모두 몇명인지 나열하는 배열로 추측된다.
    • 중간에 플레이어가 접속하면 Player Array 값으로 추가
  • FUNCTION의 Override 살펴보면 Game State 관련 함수가 없음

  • 블루프린트에서 블루프린트 액션을 펼쳐보면, FUNCTION 오버라이드에서 확인할 수 없었던 Game State 과 관련된 함수들이 있음
  • 리스폰 지연, 스타트 타임, 서버의 월드 시간 등등 진행과 관련된 액션 함수들이 존재


Player State 멤버 필드와 멤버 함수

네트워크에서는 Player State 통해 서버와 클라이언트 중간에서 플레이어의 데이터를 주고받을 수 있습니다.

게임 스탯과 차이점은 게임 스탯은 유니크하고 플레이어 스탯은 접속한 클라이언트 각자 다 갖게됩니다.

온라인 게임으로 경쟁 게임으로 팀을 나누어 게임을 만들어야 한다면 관련된 클래스를 상속하고 변수와 함수들을 만들어 게임을 개발해야 하는데 어느 클래스로 상속할지 고민할 수 있습니다. 게임 모드 중 Player State 클래스로 상속하여 진행하는 것이 나은 선택이 될 수 있습니다. 즉, 온라인의 게임 모드 중 가장 중요한 역할로 담당합니다.

💡
Game Mode 와의 차이점은 클라이언트 Player의 데이터를 관리할 수 없으나 Player State로 클라이언트 Player의 데이터 관리하고 매니저의 역할을 수행할 수 있다.

Game State 추가한 것처럼 Player State 블루프린트를 추가하도록 한다.

블루프린트를 열어서 멤버 필드와 함수들을 살펴보자.

  • 스코어와 플레이어를 구분하는 아이디 등이 있다.
  • 함수에는 CopyProperties 그리고 OverrideWith 로 특수한 함수로 보인다.

대시보드를 열고 플레이어들의 점수를 표시에 도와주는 필드와 함수로 보여진다.

사용자가 직접 kill, death, assistance 변수를 만들어 KDA 구현하거나 아이템을 표시해주는 필드와 함수들도 추가해볼만 하다.


World Settings 게임 모드 클래스 추가하기

앞서 생성한 블루프린트를 모두 지정하도록 합니다.


클라이언트 Outliner 살펴보기

게임을 구동한 이후 우측 Outliner 레이아웃의 톱니바퀴를 눌러 Choose.. -> Client0 으로 선택해줍니다.

게임에서 접속한 클라이언트는 2명입니다.

추가한 블루프린트 아이템이 월드에 구동되는지 표시되고,
앞서 추가한 GameState, PlayerController 등등 확인할 수 있습니다.

PlayerState와 ThirdPersonCharacter Pawn 클래스 각자의 클라이언트마다 소유하고 있다는 것을 볼 수 있습니다.