UE5でオンラインゲームを開発し始めてどこに何の情報を持たせるか悩んだのでまとめる。
 GameInstance
| 項目 | 
内容 | 
| ライフサイクル | 
ゲーム全体で1つだけ常駐(アプリ起動〜終了まで)レベル遷移しても消えない | 
| レプリケーション | 
サーバーとクライアントそれぞれ独立に存在しレプリケーションされない | 
| 主な用途 | 
グローバル設定保存、セッション管理など | 
| 主な関数 | 
Init(), Shutdown()
 | 
 GameMode
| 項目 | 
内容 | 
| ライフサイクル | 
各レベルに1つ(レベル切り替えで変わる) | 
| レプリケーション | 
サーバーのみに存在し、クライアントでは存在しない | 
| 主な用途 | 
プレイヤーのスポーン、勝敗判定、ルール管理 | 
| 主な関数 | 
StartPlay(), ChoosePlayerStart(), HandleMatchHasEnded()
 | 
 GameState
| 項目 | 
内容 | 
| ライフサイクル | 
各レベルに1つ | 
| レプリケーション | 
サーバーで1つ作られクライアントにレプリケートされる | 
| 主な用途 | 
試合の進行状態(残り時間、ラウンド数など)、プレイヤーリスト保持 | 
| 主な関数 | 
OnRep_MatchState, HandleBeginPlay()
 | 
GameModeとの違いはレプリケートされて全てのクライアントで値を共有できること。
ゲーム中の全体に関わる動的な値を保持するのに使える。
 PlayerState
| 項目 | 
内容 | 
| ライフサイクル | 
各プレイヤーに1つ | 
| レプリケーション | 
サーバーとすべてのクライアントで作成され、全ての環境にレプリケートされる | 
| 主な用途 | 
プレイヤーのスコア、選択キャラ、名前などのプレイヤー情報共有 | 
| 主な関数 | 
OnRep_スコア, CopyProperties()
 | 
各プレイヤーの情報を保持し、互いのプレイヤーで参照できる。
SeamlessTravelを使うとオンラインでマップをまたいで値が保持される。
 PlayerController
| 項目 | 
内容 | 
| ライフサイクル | 
各プレイヤーに1つ(接続時に生成) | 
| レプリケーション | 
サーバーとクライアントそれぞれに存在、サーバーには全てのクライアントのものがレプリケートされる | 
| 主な用途 | 
入力処理、UI操作、カメラ制御 | 
| 主な関数 | 
SetupInputComponent(), BeginPlay(), Tick()
 | 
 参考
Discussion