내일배움캠프/TIL

TIL260608 - Unreal

옆집히드라 2026. 6. 8. 20:52

1. 핵심 개념


  • GameMode & States

2. 상세 내용


 

2.1. GameMode & States

게임 플레이에 관한 정보는 GameMode와 GameStates에 의해 관리된다.

게임을 구성하는 규칙들은 게임 모드를 구성한다. 이때 게임모드는 다음과 같은 룰을 포함한다.

  • 플레이어(또는 spectators)의 목록
  • 게임을 어떻게 들어오는지, 스폰 지역과 스폰 행동
  • 게임이 정지되었는지, 정지 되었다면 어떻게 처리되는지
  • 레벨 간 전환

룰과 관련된 이벤트는 다른 모든 플레이어들에 의해 추적되거나(tracked) 공유될 수 있어야 한다. 이러한 정보는 GameState에 의해 저장되고 동기화 된다. 이때 GameState는 다음과 같은 정보(information)를 포함한다.

  • 러닝 타임
  • 각 플레이어가 언제 접속(join) 했는지, 그리고 각 플레이어의 현재 상태
  • 현재 Game Mode의 베이스 클래스
  • 게임이 시작되었는지, 아닌지

Game Modes

  • AGameModeBase: 모든 게임 모드의 베이스 클래스로 부적인 구현이 없어서 가벼움(simplicity & efficiency)
  • AGameMode: AGameModeBase의 파생 클래스로 match state 개념이 추가되어서 멀티플레이 슈터 장르 같은 게임에 적합하다.

1. AGameModeBase (기본 게임 모드) 모든 게임 모드의 최상위 기본 클래스이며, 게임의 전반적인 뼈대와 플레이어 접속 관리를 담당합니다.

  • 서버 전용: 이 클래스는 오직 서버에만 존재하며 클라이언트에는 복제(Replication)되지 않습니다. 클라이언트는 현재 어떤 게임 모드 클래스가 쓰이는지만 알 수 있고, 내부 변수에는 접근할 수 없습니다.
  • 주요 함수:
    • InitGame: 다른 스크립트나 컴포넌트가 초기화되기 전 가장 먼저 호출되어 게임 모드의 파라미터 등을 세팅합니다.
    • PreLogin / PostLogin: 플레이어의 서버 접속 시도를 승인/거절(PreLogin)하고, 접속이 완료된 후(PostLogin) 컨트롤러에 안전하게 복제 함수를 호출할 수 있게 합니다.
    • HandleStartingNewPlayer / RestartPlayer / SpawnDefaultPawnAtTransform: 플레이어의 폰(Pawn)을 생성하고 알맞은 위치(PlayerStart 등)에 스폰시킵니다.
    • Logout: 플레이어가 게임을 떠나거나 파괴될 때 호출됩니다.

2. AGameMode (멀티플레이어 게임 모드) AGameModeBase의 하위 클래스로, 멀티플레이어 매치의 흐름을 제어하기 위한 상태기(State Machine) 기능이 추가되어 있습니다. *

  • 주요 매치 상태 (Match States):
    • EnteringMap: 맵 로딩 상태. 아직 틱(Tick)이 돌지 않습니다.
    • WaitingToStart: 틱은 돌고 있지만 아직 플레이어들이 스폰되지 않은 대기 상태입니다.
    • InProgress: 본격적인 게임 진행 상태입니다. 모든 액터의 BeginPlay가 호출됩니다.
    • WaitingPostMatch: 게임이 끝난 후 다른 맵으로 이동하기 전의 대기 상태입니다. 신규 유저 접속이 차단됩니다.
    • LeavingMap / Aborted: 맵 전환 중이거나 치명적인 오류로 경기가 중단된 상태입니다.

3. 블루프린트 게임 모드 (Game Mode Blueprints) C++ 코드를 건드리지 않고도 에디터 내에서 변수를 수정하거나 맵마다 쉽게 적용하기 위해 게임 모드를 블루프린트로 상속받아 사용합니다.

  • 기본 설정 클래스: 사용할 Default Pawn, HUD, PlayerController, Game State, Player State 등을 여기서 지정합니다.

4. 게임 모드 적용 우선순위 (Setting the Game Mode) 특정 맵에 게임 모드가 적용되는 순서입니다. (1번이 가장 우선순위가 높습니다)

  1. URL 인자: 게임 실행 시 명령줄에 ?game=MyGameMode 파라미터를 강제로 전달할 때.
  2. 맵 접두사 (Map Prefixes): DefaultEngine.ini에 규칙을 정해둘 때 (예: 맵 이름이 DM-으로 시작하면 데스매치 모드 자동 적용).
  3. 월드 세팅 (World Settings): 에디터 내부의 개별 맵 세팅 창에서 덮어쓰기(Override)할 때.
  4. 프로젝트 세팅: 기본 세팅(GlobalDefaultGameMode)에 설정된 값.

5. 게임 스테이트 (Game State) 서버에서 관리되는 게임의 전반적인 상황을 모든 클라이언트에게 동기화(Replication)하는 역할을 합니다.

  • 관리 목적: '팀 전체 점수', '접속된 플레이어 목록', '완료된 퀘스트' 등 특정 개인이 아닌 모두가 공유해야 하는 정보를 담는 데 사용합니다. (개인의 킬/데스 점수는 PlayerState에서 관리하는 것이 맞습니다.)
  • 주요 기능 (AGameStateBase):
    • GetServerWorldTimeSeconds(): 서버와 클라이언트 간에 오차가 없는 동기화된 서버 시간을 반환합니다.
    • PlayerArray: 현재 게임에 접속한 모든 플레이어의 상태(APlayerState)를 담고 있는 배열입니다.
    • HasBegunPlay(): 게임이 본격적으로 시작되어 BeginPlay가 호출되었는지 여부를 확인합니다.
  • 플레이어 스테이트(Player State)
    A PlayerState is created for every player on a server (or in a standalone game). PlayerStates are replicated to all clients, and contain network game relevant information about the player, such as playername, score, etc.

3. 질문 및 해결 (Q&A)


4. 관련 문서 (Links)


'내일배움캠프 > TIL' 카테고리의 다른 글

TIL260610 - Unreal - GAS3  (0) 2026.06.10
TIL260609 - Unreal - GAS2  (0) 2026.06.09
TIL260605 - Unreal - GAS1  (1) 2026.06.05
TIL260604 - Unreal  (0) 2026.06.04
TIL260602 - 개인  (0) 2026.06.02