GameMode、GameInstanceなどの違いについて
妹「毎回悩むんだけど、主人公のパラメータってどこに置いとけばいいもんなのかな? HPとか、持ってるアイテムとか。別のレベルでも引き継いで使いたいんだけど。色んな説明読むとライフの保存場所に適してるとか書いてあるけど、他のとこにも適してるって書いてあったりするし。サンプルプロジェクトでも使い方めちゃくちゃだし」
「そのへんはゲームの内容によっても違ってくるだろうからね。例えば敵味方同じ条件で戦うようなゲームだと、敵と味方で同じようなアクタで作って、そうするとパラメータ処理もアクタに持たせるのが自然な場合もあるだろうし。あとオンラインでマルチプレイすると必要になる仕組みもある」
クラス名 | 有効期間 | 制限 | マルチプレイヤー | 備考 |
---|---|---|---|---|
普通のActor | Destroy、もしくはマップ切り替えまで | |||
PlayerController | Destroy、もしくはマップ切り替えまで | Pawnにつき1つ | サーバーには全プレイヤー分あるけど、クライアントには自分の分しかない | Pawnが消滅しても、PlayerControllerは新しいPawnに紐付けて使用可能。変数も残る |
SaveGame | Destroy、もしくはマップ切り替え | データ保存 | ||
GameInstance | ゲームを起動している間 | プロジェクトごとに1つ | 不明 | プロジェクト設定でどのクラスを使うか決める。UE4.4で追加 |
GameMode | マップ切り替えまで | レベルごとに1つ | サーバーにだけ存在 | プロジェクトのデフォルトとは別にレベルごとの設定も出来る |
GameState | マップ切り替えまで | レベルごとに1つ | 全プレイヤーが同じ物を使用 | GameModeで使用するクラスを選ぶ |
PlayerState | レベルごとに1つ | 各プレイヤーがデータを持っていて、他のプレイヤーの分もGET出来る | GameModeで使用するクラスを選ぶ | |
レベルブループリント | マップ切り替えまで | レベルごとに1つ | 他のブループリントからの参照が困難で、同じような処理の共通化も難しい |
参考資料
docs.unrealengine.com
docs.unrealengine.com
「一応それっぽい候補について違いを調べてきた。でもちゃんと検証してないし、使ったことないクラスもあるから、間違ってるとこがあるかも」
妹「なんか思ってたのより候補がいっぱいある……」
「海外フォーラムでも『結局何がどう違うんだよ!』みたいなことは結構書いてあったんだけど、一番の違いはマルチプレイヤーの場合の動作だと思う。逆に言うと1人用ゲームの場合だとあまり違いがない。例えばGameModeとGameStateとPlayerStateとか1人用だとどこに変数を置いても一緒だと思う」
妹「マルチプレイヤーも一緒でいいのに、なんでそんな色々作っちゃったの?」
「1番の理由は通信速度の問題。1人用プレイの場合だと、SETしてGETするだけなら一瞬だけど、インターネット経由で別々の人がSETとGETをするとなると、それが一瞬じゃなくて二瞬ぐらいになる。通信状況が悪かったり、別の国や星だったりするともっとかかる。だからせめて送らなくて良いデータは送らないで済むようにしようと、通信の必要度ごとにクラスを分けてある」
妹「一緒と言われても、それはそれで困る……セーブする時はSaveGame使うし、別のマップに移動する時はGameInstanceを使いそうだけど」
「とりあえずマップを切り替えるのは確定してるから、GameInstanceが無難だと思う。Instanceのを直接読み書きするか、別のアクタとかに値をコピーして使うかはお好みで」