게임 모드(Game Mode)
- 존재하는 플레이어, 허용된 플레이어, 관람자의 수, 최대 관람자 수
- 플레이어가 게임에 들어오는 방식, 스폰위치, 선택 규칙과 기타 스폰/리스폰 동작
- 게임 일시정지 가능 여부, 게임 일시정지 처리 방식
- 레벨간의 전환, 게임의 시네마틱 모드 시작 여부 포함
게임 스테이트(Game State)
- 게임 실행 기간(로컬 플레이어 참가 전 실행 시간 포함)
- 각 플레이어의 게임 참가 기간, 그 플레이어의 현재 상태
- 현재 게임 모드의 베이스 클래스
- 게임 시작 여부
게임 모드 베이스(Game Mode Base)
* 간략한 정의 : 고전 AGameMode를 단순화 시키고, 효율화 시킨 클래스
함수 / 이벤트 | 용도 |
InitGame | InitGame 이벤트는 (PreInitializeComponents 포함) 다른 스크립트 전에 호출한다. 파라미터를 초기화시킨다. 헬퍼 클래스를 스폰시킵니다. |
PreLogin | 서버에 접근 시도중인 플레이어를 수락 또는 거부한다. ErrorMessage에 공백이 아닌 스트링을 입력하면 Login 함수가 실패하도록 만듦. PreLogin은 Login 전 호출된다. 참가 플레이어가 게임 콘텐츠를 다운로드할 때, 시간이 한참 지나서야 Login이 호출될 수 있다. |
PostLogin | 로그인 성공 이후 호출된다. PlayerController에서 리플리케이트되는 함수 호출을 하기에 안전한 첫 번째 장소이다. 블루프린트로 OnPostLogin을 구현하여 부가 로직을 추가 할 수 있다. |
HandleStartingNewPlayer | PostLogin 또는 심리스 트래블 이후 호출된다. 블루프린트에서 덮어써서 새 플레이어에게 벌어지는 일을 변경할 수 있다. 기본적으로 플레이어에 대한 폰을 생성한다. |
RestartPlayer | 플레이어의 폰 스폰을 시작하기 위해 호출된다. 폰의 스폰 위치를 정하고자 하는 경우 RestartPlayerAtPlayerStart와 RestartPlayerAtTransform도 있다. OnRestartPlayer를 블루프린트에서 구현하여 이 함수 완료 후의 로직을 추가 할 수 있다. |
SpawnDefaultPawnAtTransform | 플레이어의 폰이 실제 스폰되는 곳으로, 블루프린트에서 덮어 쓸 수 있음. |
LogOut | 플레이어가 게임을 떠나거나 소멸되었을 때 호출된다. OnLogOut을 구현하여 블루프린트 로직으로도 코딩 할 수 있다. |
게임 모드 : 설명
- 게임에는 게임 모드가 몇이든 있지만, 한 번에 하나의 게임모드만 사용할 수 있다.
- 게임 모드 액터는 UGameEngine::LoadMap()을 통해 플레이할 레벨을 초기화시킬 때마다 인스턴스를 만든다.
- 게임 모드는 원격 클라이언트에 리플리케이트되지 않는다. 즉 서버에만 존재한다.
- 로컬 클라이언트는 원본 게임 모드 클래스나 BP를 볼 수 있지만, 실제 인스턴스에 접근이 불가능(변수 및 변경 요소 모름)하다.
- 플레이어가 현재 게임 모드 관련해서 업데이트된 정보가 필요한 경우, 그 정보는 AGameStateBase 액터에 저장된 내용을 통해 쉽게 동기화 상태를 유지할 수 있으며, 이 중 하나를 게임 모드와 함께 생성한 다음 모든 원격 클라이언트로 리플리케이트한다.
게임 모드 : 정의
- AGameModeBase의 서브클래스로, 멀티플레이어 경기 및 기존 작동방식 지원을 위한 부가 함수가 추가됨.
- 새롭게 생성된 프로젝트 : AGameModeBase를 기본으로, 부가 함수 필요시 : AGameMode를 상속
- AGameMode를 상속하는 경우, 경기 스테이트 머신도 지원하는 AGameState에서 게임 스테이트를 상속해야한다.
- AGameMode에는 경기 또는 일반 게임플레이 흐름 상태를 기록하는 스테이트 머신이 들어있다.
- 현재 상태를 질의하기 위해서는 GetMatchState또는 HasMatchStarted, IsMatchInProgress, HasMatchEnded와 같은 래퍼(wrapper)를 사용하자.
게임 모드 : 경기 상태
상태 | 설명 |
EnteringMap (맵 진입) |
첫 시작 상태로, 액터 틱은 아직 이루어지지 않고 있으며, 월드는 제대로 초기화되지 않은 상태다. 모두 완전히 로드되면 다음 상태로 전환된다. |
WatingToStart (시작 대기중) |
그 다음 상태로, 여기에 들어갈 때 HandleMatchIsWatingToStart(경기 시작 대기중 처리)가 호출됨. 액터 틱은 이루어지지만, 플레이어는 아직 스폰되어있지 않다. ReadyToStartMatch(경기 시작 준비)가 true를 반환, 또는 StartMatch가 호출되면 다음 상태로 전환됨. |
InpProgress (진행중) |
게임의 주요 부분이 일어나는 상태로, 대부분 이 상태에서 머문다. 여기에 들어갈 때 HandleMatchHasStarted(경기 시작 처리)가 호출되며, 그 후 모든 액터에서 BeginPlay(플레이 시작)을 호출한다. 이 시점에서 일반적인 게임플레이가 진행된다. ReadyToEndMatch(경기 종료 준비)가 true를 반환, EndMatch(경기 종료)기 호출되면 다음 상태로 전환된다. if) 참가를 기다리는 동안 플레이어가 이동할 수 있으면, 위와 같은 상태를 덮어쓰면 된다. |
WatingPostMatch (경기후 대기) |
끝에서 두 번째 상태로, 여기에 들어설 때 HandleMatchHadEnded(경기 종료 처리)가 호출된다. 액터 틱은 여전히 일어나지만 새로운 플레이어는 참가 할 수 없다. 맵 이동이 시작되면 다음 상태로 전환된다. |
LeavingMap (맵 떠나기) |
일반적인 흐름의 마지막 상태로, 여기에 들어설 때 HandleLeavingMap(맵 떠나기 처리)를 호출한다. 경기가 이 상태에 머물러있다가 맵 전환이 일어나면 EnteringMap(맵 진입) 상태로 돌아간다. |
Aborted (중단) |
실패 상태로, AbortMatch(경기 중단)을 호출하면 시작된다. 복구할 수 없는 오류가 발생했을 때 설정된다. |
게임 스테이트 : 정의
- 클라이언트가 게임의 상태를 모니터링할 수 있도록 한다.
- 접속된 모든 클라이언트가 알아야 하는 정보, 플레이어 개개인이 아닌 게임모드에 관련된 정보를 관리한다. (* 깃발 뺏기에서 개별 플레이어 단위를 기록(개인의 점수)의 경우 Player State에서 보다 깔끔하게 처리하자.)
- 일반적으로 게임플레이 도중 변하면서 모두에게 관련이 있고 보일 수 있는 프로퍼티 기록(접속된 플레이어 목록, 깃발 뺏기 게임의 팀 점수, 오픈 월드 게임에서 완료한 미션)을 유지해야 한다.
- 게임 모드는 서버에만 존재하는 반면, 게임 스테이트는 서버에 존재하면서 모든 클라이언트에 리플리케이트되어, 연결된 모든 기기의 게임 최신 상태를 유지합니다.
게임 스테이트 : 자주 사용되는 함수
함수 또는 변수 | 용도 |
GetServerWorldTimeSeconds | UWorld 함수 GetTimeSeconds의 서버 버전이다. 클라이언트와 서버 양쪽에서 동기화되어 리플리케이션에 믿고 사용할 수 있는 시간으로 활용된다. |
PlayerArray | 모든 APlayerState 오브젝트의 배열로, 게임의 모든 플레이어에게 어떤 작업을 할 때 유용하다. |
HasBeginPlay | 게임의 액터에 대해 BeginPlay 함수가 호출된 경우 true를 반환한다. |
'DevLog > Unreal Engine' 카테고리의 다른 글
UE4 UMG, HUD, Slate (0) | 2021.02.21 |
---|---|
언리얼 엔진4 모바일 렌더링, 이것만 기억하세요 (0) | 2021.02.05 |
UE4 Pawn과 Character의 차이점 (0) | 2021.02.01 |
UE4 인터페이스(Interface) (0) | 2021.01.23 |
UE4 C++ FORCEINLINE을 활용한 Enum 클래스 디버깅 (0) | 2021.01.18 |