[UE5] 네트워크 멀티플레이어 게임관련 주요 클래스

seunghyun·2024년 5월 19일
0

Unreal Network Framework

목록 보기
2/3

Network Multiplayers 게임관련 주요 클래스

  • GameInstance
  • GameMode
    • MatchState
  • GameState
  • Pawn (and Character, which inherits from Pawn)
  • PlayerController
  • PlayerState

게임 데이터를 저장할 때 고려해야 할 사항

  • Pawn은 게임 내에서 죽거나 제거되는 경우가 많으며 그때마다 폰 클래스에 저장한 데이터도 사라진다

  • PlayerController, PlayerState는 새 레벨이 로드되지 않는 한 폰이 제거되어도 계속 존재한다

  • GameInstance

    • 게임인스턴스는 게임엔진이 시작될 때부터 종료할 때까지 존재한다

    • 서버와 클라이언트에 각각 하나의 게임인스턴스가 있고 서로 통신하지는 않는다

    • 현재 게임세션의 밖에 존재하며 레벨로드에 영향을 받지 않은 상태로 게임을 구성한다

    • 영구적인 정보를 저장할 수 있는 적합한 장소이다


GameMode

  • 레벨이 로드되면서부터 게임 종료시까지 단 1개만 존재

  • 게임 룰 : 참여 인원수, 최고점수, 게임 시작 또는 종료 조건

  • 서버측 코드에서만 접근가능하다.

Match State

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

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

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를 호출하거나 복구할 수 없는 오류가 발생했을 때, 설정된다.

Match State Handlers

  • HasMatchStarted()

  • HasMatchEnded()

  • GetMatchState()

  • SetMatchState()

  • OnMatchStateSet()


GameState

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에 접근할 때 사용
현재 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 는 클라이언트와 서버에 존재하지만 다른 클라이언트끼리는 공유하지 않는다

  • PlayerController는 클라이언트 서버간의 통신에 관련한 작업을 주로 한다

  • 플레이어 입력을 통해 캐릭터을 조종할 수 있도록한다.

  • 서버측에서는 모든 PC에 접근 가능

  • 클라이언트 측에서는 현재 캐릭턱의 PC만 접근가능


Pawn

  • 플레이어를 대신할 액터(액터,폰,개릭터)

  • 서버측에서는 모든 Pawn에 접근할 수 있다.

0개의 댓글

관련 채용 정보