1. AGameModeBase / AGameMode
- 가장 중요한 역할: 게임의 규칙을 정의하고 관리하는 클래스. "어떻게 하면 이길까?", "언제 시작하고 끝낼까?", "플레이어는 어디에서 스폰될까?" 같은 게임 플레이의 핵심적인 논리를 담당한다.
- 존재하는 곳: 오직 서버에서만 존재. 클라이언트에는 이 GameMode의 인스턴스가 없다.
- 복제 여부: 클라이언트로 복제되지 않는다. 클라이언트는 GameMode를 알 수 없고, 따라서 클라이언트에서 GameMode에 접근하려고 하면 nullptr이 된다.
- 생성/소멸 시점: 맵이 로드될 때 서버에서 생성되고, 맵이 언로드될 때 소멸된다.
- 주요 사용처:
- 플레이어 스폰 지점 및 캐릭터 설정: DefaultPawnClass 등을 통해 어떤 캐릭터가 스폰될지 정해준다.
- 로그인/로그아웃 처리: 플레이어가 게임에 접속(PostLogin)하거나 나갈 때 처리하는 로직을 담당한다.
- 라운드 관리: 게임의 시작, 일시 정지, 종료, 라운드 전환 등의 전체적인 흐름을 제어한다.
- 점수 계산 및 승패 결정: 누가 이겼고 누가 졌는지, 그리고 점수는 몇 점인지 등을 서버에서 최종적으로 판단한다.
- 기본 클래스 지정: PlayerController, PlayerState, GameState, DefaultPawn 등으로 어떤 C++ 클래스나 블루프린트 클래스를 사용할지 여기서 지정한다.
- 왜 서버 전용일까?: 게임의 핵심 규칙이 변조되지 않도록 하기 위함이다. 클라이언트가 GameMode에 접근할 수 있다면, 해킹 등을 통해 게임 규칙을 마음대로 바꿀 수 있는 보안 문제가 생길 수 있다.
- AGameMode와 AGameModeBase의 차이: AGameModeBase는 최소한의 기능을 제공하고, AGameMode는 AGameModeBase를 상속받아 더 많은 게임플레이 관련 기능을 추가한 것. (예: 플레이어 수, 팀 개념 등). 복잡한 게임에서는 AGameMode를, 간단한 게임에서는 AGameModeBase를 주로 사용한다.
2. AGameStateBase / AGameState
- 가장 중요한 역할: 게임 전체의 공통적인 상태 정보를 저장하고 모든 플레이어에게 동기화하는 클래스.
- 존재하는 곳: 서버에도 존재하고, 모든 클라이언트에도 복제되어 존재한다.
- 복제 여부: 서버에서 모든 클라이언트로 복제. bReplicates가 기본적으로 true.
- 생성/소멸 시점: GameMode와 마찬가지로 맵 로드 시 생성, 언로드 시 소멸.
- 주요 사용처:
- 전체 게임 타이머: 모든 플레이어가 동일한 시간을 볼 수 있도록 GameState에 타이머 변수를 넣어 복제.
- 총 점수, 라운드 정보: 모든 플레이어가 공통적으로 알아야 할 게임의 점수나 현재 라운드 같은 정보.
- 플레이어 목록: 현재 접속 중인 모든 PlayerState의 목록을 유지하기도 한다.
- 게임 단계/페이즈: "게임 준비 중", "게임 진행 중", "게임 종료"와 같은 현재 게임의 전반적인 상태를 표시.
- GameMode와의 관계: GameMode가 게임 규칙에 따라 GameState의 변수들을 업데이트하면, 그 GameState는 서버에서 클라이언트들에게 복제되어 모든 플레이어가 최신 게임 상태를 알 수 있게 된다. GameMode는 GameState의 주인과 같다고 생각하면 된다.
- AGameState와 AGameStateBase의 차이: AGameStateBase는 최소한의 기능을, AGameState는 더 많은 게임플레이 관련 기능을 추가한 것.
3. APlayerController
- 가장 중요한 역할: 한 명의 플레이어와 게임 사이의 인터페이스 역할을 한다. 플레이어의 입력을 받아 캐릭터를 조종하고, UI를 표시하고, 카메라를 제어하는 등 개별 플레이어의 '의지'를 게임에 전달하는 담당자.
- 존재하는 곳:
- 서버: 모든 플레이어의 PlayerController 인스턴스가 존재한다 (규칙 관리 및 전체 플레이어 상태 동기화 목적).
- 각 클라이언트: 자신을 조작하는 PlayerController 인스턴스가 로컬(local)로 존재하며, 다른 플레이어들의 PlayerController의 복제본(proxy)이 존재.
- 복제 여부: 서버에서 각 클라이언트로 복제. bReplicates가 기본적으로 true.
- 생성/소멸 시점: 플레이어가 서버에 로그인할 때 생성되고, 로그아웃할 때 소멸된다. 맵 전환 시에도 사라지지 않고 유지될 수 있다 (Seamless Travel).
- 주요 사용처:
- 입력 처리: 마우스, 키보드, 게임패드 등의 입력 이벤트를 받아서 Pawn을 조종하거나 UI를 조작. (여기서 IsLocalController()가 매우 중요하게 사용된다.)
- Pawn (캐릭터) 소유 및 제어: 어떤 캐릭터(Pawn)를 자신이 조종할지 결정하고 실제로 제어. (Possess 함수)
- UI 관리: HUD, 위젯 메뉴 등을 생성하고 화면에 표시하는 역할을 한다. (보통 로컬 PlayerController에서만 UI를 생성.)
- 카메라 제어: 플레이어의 시점을 관리하고 카메라 설정을 변경해.
- RPC 호출: 클라이언트에서 서버로 특정 명령을 보낼 때, Server RPC는 주로 PlayerController를 통해 호출.
- IsLocalController()와 IsLocallyControlled():
- PlayerController의 IsLocalController(): "내가 이 클라이언트의 직접적인 입력 소스인가?"
- Pawn의 IsLocallyControlled(): "내가 IsLocalController()가 true인 PlayerController에게 제어되고 있는가?" (캐릭터 입장에서 본 제어권)
4. APlayerState
- 가장 중요한 역할: 한 명의 플레이어에 대한 '네트워크에서 공유되어야 할' 상태 정보를 저장하고 동기화하는 클래스.
- 존재하는 곳: 서버에도 존재하고, 모든 클라이언트에도 복제되어 존재.
- 복제 여부: 서버에서 모든 클라이언트로 복제. bReplicates가 기본적으로 true.
- 생성/소멸 시점: PlayerController와 동일하게 플레이어가 로그인/로그아웃할 때 생성/소멸되고, 맵 전환 시에도 유지될 수 있다.
- 주요 사용처:
- 플레이어 고유 정보: 플레이어 이름, 플레이어 ID, 현재 점수, 킬/데스 수, 역할 등.
- 팀 정보: 플레이어가 속한 팀.
- 플레이어 별 게임 데이터: 해당 플레이어에게만 특별히 존재하는 게임 데이터 (단, 플레이어 '컨트롤'과 관련된 데이터는 PlayerController에, 캐릭터 '외형/능력치'는 Pawn에 들어가는 경우가 많다).
- PlayerController와의 관계: 각 PlayerController는 하나의 PlayerState를 가지고 있다. PlayerController가 플레이어의 행동을 조종한다면, PlayerState는 그 플레이어의 '명함이자 성적표'라고 생각할 수 있다. 서버의 GameMode나 GameHUD가 PlayerState의 정보를 가져와서 스코어보드 같은 걸 만들어 모든 플레이어에게 보여줄 수 있다.
5. UGameInstance
- 가장 중요한 역할: 게임의 전체 실행 세션 동안 데이터를 유지하는 클래스. GameMode, GameState 등이 맵이 바뀔 때마다 파괴되고 새로 생성되는 반면, GameInstance는 게임이 완전히 종료될 때까지 살아남는다.
- 존재하는 곳: 서버와 각 클라이언트 모두 각자의 인스턴스를 하나씩 가지고 있다.
- 복제 여부: 복제되지 않음. 각 GameInstance는 서로 독립적으로 동작한다. (서버의 GameInstance와 클라이언트의 GameInstance는 서로 다른 객체.)
- 생성/소멸 시점: 게임이 시작될 때 한 번 생성되고, 게임이 종료될 때 소멸.
- 주요 사용처:
- 세션 간 데이터 유지: 맵 이동 시에도 사라지지 않아야 하는 데이터(예: 플레이어 저장 데이터, 옵션 설정, 현재 로그인한 사용자 정보, 다음 로드할 맵 정보 등).
- 서버 연결 관리: GameInstance에서 서버 접속 및 세션 관리를 위한 코드를 넣기도 한다.
- 멀티플레이어 로비: 로비에서 다음 게임으로 넘어갈 때까지 플레이어 정보를 유지하는 등.
- GameMode 등과의 관계: GameInstance는 모든 GameMode, GameState 등이 사라져도 남아있기 때문에, 전반적인 게임 라이프사이클을 아우르는 데이터를 보관하기에 가장 적합하다.
'언리얼엔진5 공부' 카테고리의 다른 글
| [UE5] 멀티플레이 복제 RepNotify / OnRep / ReplicatedUsing (0) | 2025.12.08 |
|---|---|
| 기본적인 멀티플레이 변수 복제 흐름 (0) | 2025.12.03 |
| 채팅 프로젝트 생성 (0) | 2025.11.27 |
| Unreal Garbage Collection (0) | 2025.11.25 |
| 델리게이트 (0) | 2025.11.24 |