ゲーム制作雑記録 - Unreal Engine - Blueprint - SubLevelと複数PlayerStartのメモ

アクション・ゲームでは定番のステージ・クリア型ですが、一つのレベルで複数レベル管理をするレベル・ストリーミングの機能でハマったのでメモを残します。従来の通り一つずつOpen Levelでレベルを開けば問題無いのですが、特に意味もなく興味本位でレベル・ストリーミング機能を使おうとしたばっかりに… 複数PlayerStart 一つのレベルに複数のPlayerStartがある場合にRestart Player At Player Startという関数でPlayerStartを指定してリスタートできるのですが、Destroy Actorしないとリスタートできなかったりして中々使いづらい(Kill ZがDestroyedイベントなのが…)。さらにRestart GameはPlayerStartを指定することができない。私が調べた限り、PlayerStartを指定して半恒久的にプレイヤーの開始位置にするという、気の利いた機能は現在UE5.5では無いようです。(ソースをサラッと見た感じ、情報を保持していないっぽい。) ただGameModeBaseの関数「ChoosePlayerStart」をオーバーライドして処理を実装すれば可能です。開始位置を動的に変更する際には、当然GameModeはプレイヤー・キャラがスポーンする前の話なので、GameInstance等から値を引き渡す必要があります。Destroyされても問題無いですし。 例)GameModeのイベント・グラフ (なんかStage NumberとかいうInteger型を使ってますが、そのままString型でもいいですね。) この例で気を付けないといけないのは関数「FindPlayerStart」の「Incoming Name」に必ず存在する「Player Start Tag」を指定することです。そうしないと自分自身(ChoosePlayerStart)を呼んじゃうので無限ループになります。(検知してくれるのでPCがデストローイ!されることはありません。) ちゃんとした関数を作りたい場合は「Get All Actors of Class」で「Player Start」クラスを取得して「Player Start Tag」で存在チェックするロジックを入れたら、いい感じになります。 ...