🎮

【UE5】複数のPlayerStartから初期スポーンを選択、中間ポイントでスポーン地点を更新する

2023/02/10に公開


レベルに PlayerStart を複数置いて中間ポイントを実装する方法を紹介します。

更新

2023/02/10 タグが見つからない場合に実行できないバグがあったので修正しました。

PlayerStartを継承したBPクラスの作成

まず PlayerStart を継承した Blueprint クラスを作成します。(ここでは MyPlayerStart とします。)

適当にレベルに2つ以上 MyPlayerStart クラスを配置します。

そして、配置した MyPlayerStart を選択し、Details パネル(詳細パネル)から PlayerStartTag を設定します。(仮にS01, S02とします。)

この時点でプレイすると、初期地点はランダムになります。これを必ず指定したものになるようにします。

GameModeの作成

プロジェクト専用のGameModeを作ります。

  1. GameModeBase(もしくは GameMode )を継承した Blueprint を作成します。(ここでは MyGameMode とします)

  2. 作成した MyGameMode で左側の FUNCTIONS から Override を選択し、ChoosePlayerStart 関数をオーバーライドします。

  1. Name型の変数 DefaultPlayerStartTag を MyGameMode に作成し、初期地点となるタグ名を指定します。(ここでは S01 としました。)
  2. 以下のように GetAllActorsOfClass で PlayerStart クラスを全て取得し、タグが一致するものを返すようにします。なければ元の ChoosePlayerStart を呼びランダムになるようにします。

プレイすると S01 の PlayerStart から必ず生成されるはずです。S01 がない場合はデフォルト挙動でランダムになります。

PlayerStartを拡張して中間地点を保存する

MyPlayerStart を修正して、触れたらそこを中間地点として保存する仕組みを作ります。

  1. Capsule コンポーネントを追加してサイズを調整します。(大体 HalfHeight=90, Radius=40 でルートのカプセルと同じ大きさになります。)
  2. Capsule コンポーネントの Collision Preset は OverlapAll などにしておきます。

※ここでわざわざルートにある Capsule と別で Capsule コンポーネントを作ったのは PlayerStart の元クラスがBPで Overlap イベントを作れないようになっているためです。

  1. 作成した Capsule コンポーネントの Begin Overlap イベントを作成し、 PlayerStartTag を保存します。
    ここではプロジェクト用の PlayerState クラスに保存しています。

リスポーン処理を入れる

プレイヤーが死亡した時などに呼ぶことができるリスポーンの処理を作成します。

以下のように MyGameMode クラスに GameOver イベントを作成します。
やっていることは、先ほど保存した PlayerStartTag を使って PlayerStart を検索し、 RestartPlayerAtPlayerStart 関数を呼んでいるだけです。
※リスタートする前にプレイヤーを削除しないと上手くいきませんでした。

あとは好きなところから GameOver イベントを呼び出してください。
例. プレイヤーのHPが0になったとき, 落下したとき...

まとめ

  • PlayerStartは複数置くとデフォルトではランダムでスポーンされる
  • PlayerStartにはTagがあり選択できるようになっている
  • GameModeBase::ChoosePlayerStart関数をオーバーライドして初期地点を変更できる

Discussion