[UE]プレイヤーの初期位置を重複しないようにする方法

Unreal Engine

<検証時のバージョン>
Unreal Engine 5.0.3

<前置き>
マルチプレイヤーゲームにおいて、レベル上にPlayerStartを複数配置して、プレイヤーの初期位置をプレイヤーごとに異なる位置にしたい場合があるかと思います。

GameModeBaseクラスのChoosePlayerStart関数にて、同じPlayerStartがプレイヤーの初期位置として適応されないように設計されているので、通常は気にしなくても異なる位置が適応されます。

しかし、重複しているかの判定は、スポーン対象PawnのRootコンポーネントのコリジョンにヒットするものがあるかどうか(正確にはLevelActorクラスのEncroachingBlockingGeometry関数の戻り値がFalseかどうか)で制御されるため、
例えば以下の場合ではヒットするものが無く、同じPlayerStartの位置が初期位置になることがあります。
・次のプレイヤーがスポーンされる前に初期位置から動いた場合
・GameModeクラスのDelayedStartをTrueにした場合(World SettingsのSpectator Pawnで指定したクラスのPawnがスポーンされます)

以下はDelayedStartを使用したパターンになりますが、同じPlayerStartが選択されています。

PlayerStartの配置
ゲーム開始時の位置

<対処方法>
今回は、上記のChoosePlayerStart関数とPlayerStartのPlayerStartTagを使用する方法を紹介します。
ChoosePlayerStart関数のオーバーライドはGameModeBase(またはGameModeBaseを継承したクラス)からのFUNCTIONS欄にある「Override」欄から選択することで実施できます。

BlueprintNativeEventのUPROPERTYが適応されているので、c++を使用する場合は「ChoosePlayerStart_Implementation」をオーバーライドしてください。

<実装内容>
PlayerStartクラスを取得して、PlayerStartTagに特定の値(以下の場合は「Occupied」)が設定されているかを判別することで、開始位置の重複が発生しないように実装しています。

ChoosePlayerStart関数はプレイヤーが追加されるごとに実行されるので、一度選択されたPlayerStartのPlayerStartTagを更新するようにしています。
※PlayerStartを多数配置している場合は、PlayerStartの取得時にPlayerStartTagの確認をした方が良いです

PlayerStartの取得
PlayerStartTagの確認

以上で紹介は終わりです。参考になれば幸いです。

コメント