본문 바로가기
언리얼

[UE4/게임플레이 프레임 워크] 게임 모드와 게임 스테이트

by 노오오오오옹 2020. 11. 25.

1. 게임 모드와 게임 스테이트

1-1 게임 모드

1) 존재하는 플레이어, 허용된 플레이어, 관람자의 수, 최대 관람자 수

2) 플레이어가 게임에 들어오는 방식, 스폰 위치, 선택 규칙과 기타 스폰/리스폰 동작

3) 게임 일시정지 가능 여부, 게임 일시정지 처리 방식

4) 레벨간의 전환, 게임의 시네마틱 모드 시작 여부 포함


1-2 게임 스테이트

1) 게임 실행 기간 (로컬 플레이어 참가 전 실행 시간 포함).

2) 각 플레이어의 게임 참가 기간, 그 플레이어의 현재 상태.

3) 현재 게임 모드의 베이스 클래스.

4) 게임 시작 여부.


2. 게임 모드

2-1 게임 모드 베이스

1) 간략한 정의 : 고전 AGameMode를 단순화 시키고, 효율화 시킨 것

함수/이벤트 용도
InitGame InitGame 이벤트는 (PreInitializeComponents 포함) 다른 스크립트 전에 호출한다.

파라미터를 초기화킨다. 헬퍼 클래스를 스폰시킵니다.
PreLogin 서버에 접근 시도중인 플레이어를 수락 또는 거부한다. 

ErrorMessage 에 공백이 아닌 스트링을 입력하면 Login 함수가 실패하도록 만듬.

PreLogin  Login 전 호출된다.

참가 플레이어가 게임 콘텐츠를 다운로드할 때, 시간이 한참 지나서야 Login 이 호출될 수 있다.
PostLogin 로그인 성공 이후 호출된다. 

PlayerController 에서 리플리케이트되는 함수 호출을 하기에 안전한 첫 번째 장소이다.

블루프린트로 
OnPostLogin 을 구현하여 부가 로직을 추가할 수 있다.
HandleStartingNewPlayer PostLogin 또는 심리스 트래블 이후 호출된다.

블루프린트에서 덮어써서 새 플레이어에게 벌어지는 일을 변경할 수 있다.

기본적으로 플레이어에 대한 폰을 생성한다.
RestartPlayer 플레이어의 폰 스폰을 시작하기 위해 호출된다.

폰의 스폰 위치를 정하고자 하는 경우
RestartPlayerAtPlayerStart  RestartPlayerAtTransform 도 있다.

OnRestartPlayer 를 블루프린트에서 구현하여 이 함수 완료 후의 로직을 추가할 수 있습니다.
SpawnDefaultPawnAtTransform 플레이어의 폰이 실제 스폰되는 곳으로, 블루프린트에서 덮어쓸 수 있음.
Logout 플레이어가 게임을 떠나거나 소멸되었을 때 호출된다.

OnLogout 을 구현하여 블루프린트 로직으로도 짤 수 있다.

 


2-2 설명

1) 게임에는 게임 모드가 몇이든 있지만, 한 번에 하나의 게임 모드만 사용할 수 있다.

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

3) 게임 모드는 원격 클라이언트에 리플리케이트되지 않는다. 즉 서버에만 존재한다.

4) 로컬 클라이언트는 원본 게임 모드 클래스나 BP를 볼 수 있지만, 실제 인스턴스에 접근이 불가능(변수 및 변경 요소 모름) 하다.

5) 플레이어가 현재 게임 모드 관련해서 업데이트된 정보가 필요한 경우, 그 정보는 AGameStateBase 액터에 저장된 내용을 통해 쉽게 동기화 상태를 유지할 수 있으며, 이 중 하나를 게임 모드와 함께 생성한 다음 모든 원격 클라이언트로 리플리케이트한다.


3. 게임 모드

3-1. 정의

1) AGameModeBase 의 서브클래스로, 멀티플레이어 경기 및 기존 작동방식 지원을 위한 부가 함수가 추가됨.

2) 새롭게 생성된 프로젝트 : AGameModeBase를 기본으로, 부가 함수 필요시 : AGameMode를 상속

3) AGameMode를 상속하는 경우, 경기 스테이트 머신도 지원하는 AGameState에서 게임 스테이트를 상속해야한다.

4) AGameMode에는 경기 또는 일반 게임플레이 흐름 상태를 기록하는 스테이트 머신이 들어있다.

5) 현재 상태를 질의하기 위해서는 GetMatchState 또는 HasMatchStarted, IsMatchInProgress, HasMatchEnded 와 같은 래퍼(wrapper)를 사용하자.


3-2 경기 상태

상태 설명
EnteringMap
(맵 진입)
첫 시작 상태로, 액터 틱은 아직 이루어지지 않고 있으며, 월드는 제대로 초기화되지 않은 상태다.

모두 완전히 로드되면 다음 상태로 전환된다.
WaitingToStart
(시작 대기중)
 그 다음 상태로, 여기에 들어갈 때 HandleMatchIsWaitingToStart (경기 시작 대기중 처리)가 호출됨.

액터 틱은 이루어지지만, 플레이어는 아직 스폰되어있지 않다. 

ReadyToStartMatch (경기 시작 준비)가 true를 반환, 또는 StartMatch가 호출되면 다음 상태로 전환됨.
InpProgress
(진행중)
게임의 주요 부분이 일어나는 상태로, 대부분 이 상태에서 머문다.

여기에 들어갈 때 
HandleMatchHasStarted (경기 시작 처리)가 호출되며, 그 후 모든 액터에서 BeginPlay (플레이 시작)을 호출한다.

이 시점에서 일반적인 게임플레이가 진행된다. 

ReadyToEndMatch (경기 종료 준비)가 true 를 반환, EndMatch (경기 종료)가 호출되면 다음 상태로 전환된다.

IF) 참가를 기다리는 동안 플레이어가 이동할 수 있으면, 위와 같은 상태를 덮어쓰면 된다.
WaitingPostMatch
(경기후 대기)
끝에서 두 번째 상태로, 여기에 들어설 때 HandleMatchHasEnded (경기 종료 처리)가 호출된다. 

액터 틱은 여전히 일어나지만 새로운 플레이어는 참가할 수 없다. 

맵 이동이 시작되면 다음 상태로 전환된다.
LeavingMap
(맵 떠나기)
일반적인 흐름의 마지막 상태로, 여기에 들어설 때 HandleLeavingMap (맵 떠나기 처리)를 호출한다.

경기가 이 상태에 머물러있다가 맵 전환이 일어나면 
EnteringMap (맵 진입) 상태로 돌아간다.
Aborted
(중단)
실패 상태로, AbortMatch (경기 중단)을 호출하면 시작된다.

복구할 수 없는 오류가 발생했을 때 설정된다.

4. 게임 스테이트

4-1. 정의

1) 클라이언트가 게임의 상태를 모니터링할 수 있도록 한다.

2) 접속된 모든 클라이언트가 알아야 하는 정보, 플레이어 개개인이 아닌 게임 모드에 관련된 정보를 관리한다. 

※ 깃발 뺏기에서 개별 플레이어 단위의 기록(개인의 점수)의 경우 Player State에서 보다 깔끔하게 처리하자.

3) 일반적으로 게임플레이 도중 변하면서 모두에게 관련이 있고 보일 수 있는 프로퍼티 기록(접속된 플레이어 목록, 깃발뺏기 게임의 팀 점수, 오픈 월드 게임에서 완료한 미션)을 유지해야 한다.

4) 게임 모드는 서버에만 존재하는 반면, 게임 스테이트는 서버에 존재하면서 모든 클라이언트에 리플리케이트되어, 연결된 모든 기기의 게임 최신 상태를 유지합니다.


4-2. 자주 사용되는 함수

함수 또는 변수 용도
GetServerWorldTimeSeconds UWorld 함수 GetTimeSeconds 의 서버 버전이다.

클라이언트와 서버 양쪽에서 동기화되어 리플리케이션에 믿고 사용할 수 있는 시간으로 활용한다.
PlayerArray 모든 APlayerState 오브젝트의 배열로, 게임의 모든 플레이어에게 어떤 작업을 할 때 유용하다.
HasBegunPlay 게임의 액터에 대해 BeginPlay 함수가 호출된 경우 true 를 반환한다.

 

공식 문서 주소 : docs.unrealengine.com/ko/Gameplay/Framework/GameMode/index.html

댓글