Pawn은 게임 내에서 죽거나 제거되는 경우가 많으며 그때마다 폰 클래스에 저장한 데이터도 사라진다
PlayerController, PlayerState는 새 레벨이 로드되지 않는 한 폰이 제거되어도 계속 존재한다
GameInstance
게임인스턴스는 게임엔진이 시작될 때부터 종료할 때까지 존재한다
서버와 클라이언트에 각각 하나의 게임인스턴스가 있고 서로 통신하지는 않는다
현재 게임세션의 밖에 존재하며 레벨로드에 영향을 받지 않은 상태로 게임을 구성한다
영구적인 정보를 저장할 수 있는 적합한 장소이다
레벨이 로드되면서부터 게임 종료시까지 단 1개만 존재
게임 룰 : 참여 인원수, 최고점수, 게임 시작 또는 종료 조건
서버측 코드에서만 접근가능하다.
내부적으로 match state machine을 통해 game flow를 추적할 수 있으며,
GetMatchState, HasMatchStarted, ISMatchInProgress, HasMatchEnded등의 함수를 통해 현재 상황을 알 수 있다.
EnteringMap
WaitingToStart
InProgress
WatingPostMatch
LeavingMap
Aborted
HasMatchStarted()
HasMatchEnded()
GetMatchState()
SetMatchState()
OnMatchStateSet()
GameMode가 인스턴스 생성, 1개만 존재
서버, 클라이언트 측에서 접근가능
클라이언트에게 서버측 정보를 전달할 때 사용
전체 플레이어수, 전체 PlayerState 정보에 접근가능
게임 메뉴맵 -> 로비 맵 -> 게임맵 / 맵들이 로드 될 때마다 각각의 GameMode가 실행된다.
클라이언트/서버간의 게임의 현재 상태에 대한 정보교환을 위한 중요한 클래스
멀티 플레이어어 게임에서 중요한 정보인 접속된 플레이어 리스트(PlayerState의 리스트)를 포함한다
GameState는 모든 클라이언트에게 Replicated 되므로 모든 클라이언트가 이 객체에 접근할 수 있다
멀티플레이어 게임에서 가장 핵심적인 클래스 중에 하나이다
GameMode가 승리를 위한 점수를 가지고 있는 반면, GameState는 현재까지 취득한 점수를 가지고 있다
GameState에는 개발자가 임의의 정보(배열이나 구조체 등)를 저장할 수 있다
GameMode에 비해 개발자가 다루어야 할 작업은 적은 편이지만 이벤트 그래프에는 모든 클라이언트가 알아야 할 로직을 작성할 수 있다
PlayerArray MatchState, ElapsedTime은 replicated 설정되어 있으므로 모든 클라이언트에서 접근할 수 있다
GameState에 선언한 변수를 Replicated 설정하고 Switch has Authority 를 사용하여 서버측에서 값을 변경하면 모든 클라이언트에서 확인할 수 있다
궁금증: 게임스테이트는 게임모드마다 새로 만들어야하나?
LobbyGameMode ↔ LobbyGameState, BattleGameMode ↔ BattleGameState 이런식으로?
아니다! 상황에 따라 다르다
GO에서 완전 다른 녀석 (카트) 게임모드가 만들어지면 게임스테이트를 따로 만들어야하겠지만
2:2가 아니라 3:3 모드가 새로 출시된다고 하면 게임스테이트를 따로 만들지 않아도 된다!
한 플레이어의 게임 상태정보를 가지고 있다.
모든 클라이언트가 다른 PlayerState에 접근할 때 사용
현재 PlayerState의 주인이 아니면 데이터 갱신 불가
PlayerController의 단점을 극복할 수 있다. 어디서나 접근 가능하니까
모든 접속된 클라이언트는 현재 클라이언트의 정보를 포함하고 있는 한개의 PlayerState 객체를 갖는다
PlayerController 에서 PlayerState에 액세스 가능한 기능이 내장되어 있으나 PlayerState에서는 PlayerController 에 액세스를 직접적으로 할 수 있는 기능은 없다. PlayerState 와 관련된 Pawn에는 접근할 수 있다.
PlayerState 객체는 모든 클라이언트에게 Replicated 되므로 어떤 클라이언트에서 다른 클라이언트의 정보를 접할 수가 있다
현재 클라이언트에서 다른 클라이언트의 PlayerState 객체에 접근하는 쉬운 방법은 GameState::getPlayerArray 를 이용하는 것이다
PlayerName, Score 등 다른 클라이언트에게 제공해야 하는 다양한 정보(커스텀 변수)를 이 객체에 저장하여 다른 클라이언트에게 전달할 수 있다
PlayerPawn이 Destroy 되더라도 PlayerState는 유지된다
Score를 저장하기 딱 좋겠다.
엔진 코드를 살펴보면 PlayerState 클래스에서, 이미 float 타입의 Score 변수가 있으며, OnRep_Score() (가상함수) 에서 복제하는 것을 볼 수 있다. 이 함수를 재정의해서 사용하자~
서버와 소유한 클라이언트에 존재하는 객체
PlayerController 는 클라이언트와 서버에 존재하지만 다른 클라이언트끼리는 공유하지 않는다
PlayerController는 클라이언트 서버간의 통신에 관련한 작업을 주로 한다
플레이어 입력을 통해 캐릭터을 조종할 수 있도록한다.
서버측에서는 모든 PC에 접근 가능
클라이언트 측에서는 현재 캐릭턱의 PC만 접근가능
플레이어를 대신할 액터(액터,폰,개릭터)
서버측에서는 모든 Pawn에 접근할 수 있다.