본문 바로가기

강동새싹언리얼수업/최종프로젝트

SurvivorsTemplate epic

<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에서만 관리하지만, GameState Server와 Client들과 정보를 동기화해서 관리합니다.

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

 

GetServerWorldTimeSeconds

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

PlayerArray

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

HasBegunPlay

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

 

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

 

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

On possess가 되면 AsBPBaseEnemy를 설정하고 BaseControllerReference를 설정한다.

 PlayerArray를 설정하고 Behavior Tree를 설정하고 

Find Target은 밑에서 정의하는 CustomEvent이

Event를 끌어 CustomEvent를 추가하고 이름을 FindTarget으로 한다

Target변수를 끌어다 Convert validated Get으로 바꿔준다.

IsAlive는 I_CharacterManager 인터페이스의 펀션이다. 

Target이 Not valid할대

Object Value는 ControlledPawn으로 해준다.

UpdateTargetArray 펀션을 만들자

GetGamestate함수를 통해 PlayerArray를 받아와서 뭔가 죽은 적은 정리하고 살아 있는 적만 정리하는듯 

 

인터페이스 IsAlive를 통해 Output을 받아 살았으면 GetCharacter로 바꿔 PlayerArray에  Add한다.

 

BehaviorTree는 Behavior Key값이 Active하면 MoveTo로 Target을 추적한다.

BTS_EnemyBase는

EQS_findSpawnPoint는

Path Exist From Querier

distance to Querier