icon안동민 개발노트

게임 모드, 스테이트 블루프린트


 게임 모드(Game Mode)와 게임 스테이트(Game State)는 언리얼 엔진의 게임플레이 프레임워크에서 중요한 역할을 하는 클래스입니다.

 이들은 게임의 규칙, 진행 상태, 그리고 전반적인 게임 로직을 관리합니다.

게임 모드와 게임 스테이트의 역할

 1. 게임 모드 (Game Mode)

  • 게임의 규칙과 승리 조건 정의
  • 플레이어 스폰 로직 관리
  • 게임 시작과 종료 처리
  • 서버에서만 존재하며, 권한 있는 결정을 내림

 2. 게임 스테이트 (Game State)

  • 현재 게임 상태 정보 저장 및 동기화
  • 모든 클라이언트와 서버에 복제됨
  • 점수, 남은 시간 등 공유 정보 관리

게임 모드 블루프린트 생성 및 설정

  1. 콘텐츠 브라우저에서 우클릭
  2. 'Blueprint Class' 선택 후 'Game Mode Base' 선택
  3. 게임 모드 블루프린트 이름 지정 (예 : BP_MyGameMode)

 게임 모드 설정

World Settings:
- Game Mode Override: BP_MyGameMode

게임 규칙 정의

 게임 모드에서 기본적인 게임 규칙을 정의할 수 있습니다.

 예 : 시간 제한이 있는 데스매치

BP_MyGameMode:
 
Variables:
- MatchDuration: Float = 600 (10 minutes)
- ScoreToWin: Integer = 20
 
Event BeginPlay:
    |
[Start Match Timer]
 
Function: CheckWinCondition
[Get All Player States] --> [For Each Loop]
                               |
                   [Check Player Score >= ScoreToWin] --> [End Match]
 
Event OnMatchTimerEnd:
    |
[End Match]

플레이어 스폰 로직 구현

 게임 모드는 플레이어의 스폰 위치와 방법을 제어합니다.

Function: FindPlayerStart
[Get All Actor Of Class (PlayerStart)] --> [Choose Random PlayerStart]
                                       --> [Return Chosen PlayerStart]
 
Event OnPostLogin:
    |
[Find Player Start] --> [Spawn Player Pawn]
                    --> [Possess Pawn]

게임 스테이트 기반 게임 진행 상태 관리

 게임 스테이트 블루프린트 생성

  1. 'Blueprint Class' 선택 후 'Game State Base' 선택
  2. 게임 스테이트 블루프린트 이름 지정 (예 : BP_MyGameState)

 게임 진행 상태 관리 예

BP_MyGameState:
 
Variables:
- CurrentMatchState: Enum (Warmup, InProgress, EndMatch)
- RemainingTime: Float (Replicated)
 
Function: UpdateMatchState
[Set CurrentMatchState] --> [Replicate to All Clients]
 
Event Tick:
    |
[Update RemainingTime]

 게임 모드와 연동

BP_MyGameMode:
 
Event BeginPlay:
    |
[Get Game State] --> [Cast to BP_MyGameState]
                 --> [Set Initial Match State]
 
Event OnMatchStateChanged:
    |
[Update Game State] --> [Broadcast Match State to Players]

점수 시스템 구현

 게임 스테이트를 사용하여 중앙 집중식 점수 시스템을 구현할 수 있습니다.

BP_MyGameState:
 
Variables:
- TeamScores: Map (Team ID to Score) (Replicated)
 
Function: UpdateScore
Inputs: TeamID, ScoreToAdd
[Get Current Score] --> [Add ScoreToAdd]
                    --> [Set New Score in Map]
                    --> [Replicate to All Clients]
 
BP_MyGameMode:
 
Function: OnPlayerScored
Inputs: ScoringPlayer, ScoreAmount
[Get Player Team] --> [Get Game State]
                  --> [Call UpdateScore on GameState]

멀티플레이어 게임에서의 역할

 1. 게임 모드

  • 서버에서만 실행되며 권한 있는 결정 수행
  • 클라이언트 연결/연결 해제 처리
  • 팀 할당 및 밸런싱

 2. 게임 스테이트

  • 모든 클라이언트에 동기화되는 정보 관리
  • 플레이어 수, 팀 점수 등 공유 데이터 저장

 예 : 팀 밸런싱

BP_MyGameMode:
 
Function: AssignPlayerToTeam
[Get All Teams] --> [Find Least Populated Team]
               --> [Assign Player to Team]
               --> [Update Game State]
 
BP_MyGameState:
 
Variables:
- TeamPlayerCounts: Map (Team ID to Player Count) (Replicated)
 
Function: UpdateTeamPlayerCount
[Update Player Count for Team] --> [Replicate to All Clients]

효과적인 설계를 위한 팁과 주의사항

 1. 책임 분리

  • 게임 모드 : 게임 로직과 규칙
  • 게임 스테이트 : 공유 데이터 및 상태

 2. 복제 최적화

  • 필요한 정보만 게임 스테이트에서 복제
  • 빈번히 변경되는 데이터는 복제 간격 조정

 3. 확장성 고려

  • 향후 게임 모드 변형을 위한 기본 클래스 생성
  • 공통 기능은 부모 클래스로 추출

 4. 디버깅 지원

  • 주요 게임 상태 변경 시 로그 출력
  • 개발자 콘솔 명령어 구현 (상태 조회, 수정)

 5. 성능 고려

  • Tick 이벤트 사용 최소화
  • 대규모 데이터 갱신은 일정 간격으로 수행

 주의사항

  • 게임 모드의 로직이 너무 복잡해지지 않도록 주의
  • 게임 스테이트에 클라이언트별 데이터 저장 지양
  • 네트워크 지연을 고려한 상태 업데이트 설계

 게임 모드와 게임 스테이트는 게임의 핵심 구조를 형성하는 중요한 요소입니다.

 이들을 효과적으로 활용하면 일관성 있고 확장 가능한 게임플레이 시스템을 구축할 수 있습니다.

 게임 모드는 서버에서 게임의 규칙과 흐름을 제어하는 반면, 게임 스테이트는 모든 참가자가 공유해야 하는 정보를 관리합니다.

 특히 멀티플레이어 게임에서 이 두 클래스의 역할은 더욱 중요해집니다. 게임 모드는 플레이어 연결, 팀 할당, 게임 진행 상태 관리 등을 담당하고, 게임 스테이트는 이러한 정보를 모든 클라이언트에 효율적으로 전달합니다.