+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


흠... Unreal Engine의 기본 상태? 및 관리?라고 할 수 있는 것들을 알아보자!

( 어차피, 공식 Docs를 참고한거... )


*말투가 이상할 수 있는데, 그건 그냥 정리하면서 작성하다보니 그렇습니다.


<GameMode / GameState>

 

 + 기본적으로 게임에 대한 기본 규칙들을 지정하는 곳이 GameMode,

 + 게임이 돌아가고있는 상황에 대한 정보들을 저장하는 곳이 GameState.

 


[AGameModeBase]

 + 예전 언리얼 버전에서는 GameMode를 베이스로 사용했는데, 4.14버전 이후로 GameModeBase라는 것이 생겼다.

그 이유는 여러 게임에 호환성있게 사용하기 위함인데, GameMode는 기본적으로 멀티플레이어슈팅게임에 어울리도록 구성되어있다.

(아마 언리얼이 그런 장르를 기본으로 만든 엔진이라서 그럴지도)

그리서 다른 종류의 게임에서 사용할 수 있도록 GameMode의 부모인 GameModeBase를 만들었다.

내부에 다양한 함수가 있지만, 기본적으로

(작성 순서대로 실행됨)

 

// Init

InitGame

 - 해당 함수는 다른 Actor들을 포함해서 PreInitializeComponents가 실행되기전에 실행된다.

 - 말 그대로 Game 시작 전에 규칙을 설정한다는 느낌

 

// login

PreLogin

 - 서버로 접근하려는 플레이어를 처리할 때, 실행되는 함수.

PostLogin

 - 플레이어가 서버에 접근 완료하고 나서 실행되는 함수.

 

// Creage Player

HandleStartingNewPlayer

 - PostLogin이 실행되고나서 실행되며, 새로운 Player에게 적용할 일들을 처리한다.

 - 이 함수에서 새로운 Player를 생성한다.

RestartPlayer

 - 폰이 생성되기 위해서 실행되는 함수

 - 여러 함수가 있지만, 스폰 위치를 설정하기 위한 RestartPlayerAtPlayerStart / RestartPlayerAtTransform 함수 들이 있다.

 - BP에서 바인딩해서 사용할 수 있게 OnRestartPlayer함수도 있다.

SpawnDefarulPAwnTransform

 - 실제로 Player's Pawn을 생상하는 로직.

 - BP에서 Override해서 사용할 수 있다.

 

// Logout

Logout

 - Player가 게임을 떠나거나 소멸되었을 때, 실행되는 함수.

 - OnLogout을 Implement해서 사용할 수 있다.

(Override는 부모 로직이 있고 내가 재설정을 해서 사용할 수 있다면, Implement는 원하면 구현해서 사용할 수 있는 것)


와 같은 함수들이 존재한다.

 

 + 게임모드 액터는 UGameEngine::LoadMap(...)을 실행할 때, 플레이할 레벨을 초기화시킬 때 마다 인스턴스를 만든다.

 

(멀티게임 기준)

 + 서버를 두는 게임인 경우, 게임모드는 서버에서 관리하고 원격 클라로 정보를 리플리케이트 하지 않습니다. 게임 모드 정보만 읽을 수 있고, 실제 인스턴스에 접근해서 변동사항을 확인할 수 없습니다. 만약, 업데이트된 정보가 필요한 경우에는 GameStateBase를 통해 확인할 수 있습니다. 서버에서 게임모드와 함께 생성해서 클라이언트로 리플리케이트 하기 때문.

 

 

[AGameMode]

 + 예전에 기본으로 사용했던 AGameMode클래스.


 + 해당 클래스는 내부적으로 match state machine을 지원하는데, 그러다보니 해당 클래스는 사용하려면 GameState도 같은 match state machine을 지원하는 AGameState클래스를 상속해야합니다.


 + 내부적으로 match state machine을 통해 game flow를 추적할 수 있으며, 

GetMatchState, HasMatchStarted, ISMatchInProgress, HasMatchEnded등의 함수를 통해 현재 상황을 알 수 있다. 


<State>

EnteringMap

 - 맵 진입 초기단계로, 아직 맵은 로딩 중이며 Tick도 활성화되지 않은 단계

WaitingToStart

 - 게임 시작 전 대기단계로, Actor Tick은 돌아가지만 Player가 스폰되지 않은 상태.

 - ReadyToStasrt가 true를 반환하거나 StartMatch가 호출되면 다음 상태로 이동.

InProgress

 - 대부분 Player가 머무는 상태로, HandleMatchHasStarted가 호출되고 모든 Actor이 BeginPlay가 호출되는 부분.

 - ReadyToEndMatch가 true를 반환하거나 EndMatch가 호출되는 경우 다음 단계로 이동.

WatingPostMatch

 - 끝에서 2번째 단계.

 - HandleMatchHasEnded가 호출.

 - Actor Tick은 호출되지만, 새로운 Player는 참가 불가능

 - 맵 이동 시, 다음 단계로 이동

LeavingMap

 - 끝 단계

 - 이 단계로 들어갈 때, HandleLeavingMap이 호출되며, 맵 전환이 일어다면 다시 EnteringMap단계로 이동한다.

Aborted

 - 실패 단계로, AbortMatch를 호출하거나 복구할 수 없는 오류가 발생했을 때, 설정된다.

 

 + 기본적으로 제공해주는 state들이 있고 많은 시간 InProgress에 머물 것입니다.

그리고 개발자가 원한다면 Override해서 state를 추가해서 사용할 수 있다.

 

 + EpicGames-Launcher 내부에보면 DefaultEngine.ini 파일이 있는데, 해당 파일에서 모든 맵의 Default 게임모드를 설정할 수 있다.

개별은 Editor에서~

 

 

[GamsState]

 + GameState에서는 개별 클라이언트에서 게임의 상태를 모니터링할 수 있는 정보들을 입력할 수 있습니다.

즉 GameMode가 게임 전반전인 틀을 설정하는 것이라면, GameState는 현재 돌아가고있는 상태에 대한 정보를 저장하죠.

만약 Player 개개인의 정보를 관리하고싶다면, PlayerState를 이용하는 것이 좋습니다.

GameMode는 Server에서만 관리하지만, GameStateServer와 Client들과 정보를 동기화해서 관리합니다.

해당 기능을 위한 대표적인 변수/함수를보면


GetServerWorldTimeSeconds

 - UWorld함수의 GetTimeSeconds의 서버버전으로, 서버와 클라간의 동기화된 시간으로 많이 사용한다.

PlayerArray

 - 모든 APlayerState오브젝트에 대한 배열로, 게임 플레이어들에게 어떤 작업을 할 때 유용하다.

HasBegunPlay

 - 특정 Game Actor가 BeginPlay함수를 호출했는지 확인할 때 사용.

 

 + GameMode와 GameState는 서로 짝지어서 동작하기 때문에, 특정 GameMode를 만들더라도 해당 모드에 대한 GameStateAGameStateBase에서 파생되어야합니다.

 

 + C++클래스나 BP에서 많이 확장해서 사용합니다.





Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

+ Recent posts