はじめに
VRのアプリを作成した時に、キャラクターをランダムな位置に生成させる処理を作成したので、作り方の記事を書いてみます。UE4.25.1を使用しています。今回作成した処理については特にVRに依存する箇所はありません。完成イメージは以下動画のような感じです。
上記動画では100体のキャラクター生成を実施しているのですが、OulusQuestでは起動時処理が重すぎて固まっており、ちょっと処理能力の限界を超えていたようです(生成後は落ち着くのですが)。大量のニワトリを錬成した pic.twitter.com/40rj8CQRNm
— 高浜 (@SatoshiTakahama) July 13, 2020
概略仕様
・起動時に、箱型のエリア内のランダムな位置に指定した数のキャラクターを生成する
・エリアは複数配置でき、どのエリアに配置されるかもランダムに決定される
作り方
準備
・使用したいキャラクター(Characterクラスから派生させた、AIコントローラを使用するもの)がいるプロジェクトを用意します。
GameModeのBP作成
今回、GameModeは、ミニマップへの参照を手のコントローラーに渡すために使用します。
・コンテンツブラウザ上で、新規追加=>ブループリントクラスを選択するとダイアログが表示されるので、親クラスとしてGameModeを選択しOKを押します。すでにプロジェクトにGameModeがあるならそちらを使用すればよいので、新規追加はしなくても問題ないです。
・生成されたBPの名前をBP_GameModeに変更し、編集画面を起動します。
・BP_GameModeにSpawnAreaRefArray、SpawnCountの2個の変数を追加します。SpawnCountにはキャラクターを生成する数を設定しておきます(最初は少ない数で試したほうが良いと思います)。
・ワールドセッティングでBP_GameModeを設定します。
エリア指定のBP作成
・コンテンツブラウザ上で、新規追加=>ブループリントクラスを選択し、表示されるダイアログでActorを押します。
・生成されたBPの名前をBP_SpwanAreaSetに変更し、編集画面を起動します。
・BP_SpwanAreaSetに新規コンポーネント追加でBoxCollisionを追加します。
・BP_SpwanAreaSetのイベントグラフを開いて、以下のようにノードを追加します。
キャラクター生成処理を追加
・BP_GameModeの編集画面を起動し、イベントグラフを開いて、以下のようにノードを追加します。SpawnActorは、ノードを追加するときにSpawnActorで検索して"クラスからアクタをスポーンします"を選択すると、スポーンアクタNONEという名前のノードができるので、Classのところに生成したいキャラクターを指定すると下記画面のノードのように変化します。SpawnActorでキャラクターを生成するとそのままではAIコントローラーが付かないので、SpawnDefaultActorで付加するようにしています。また、キャラクターを生成するときに失敗するケースがあるので、成功したことを確認してから実行しています。
エリア指定のBPをマップ上に配置
・BP_SpwanAreaSetをいくつかマップ上に配置し、位置とサイズを適当に調整します。サイズが小さいと、キャラクターの生成に失敗する場合があるので、ある程度大きくしたほうが良いです。
完成
ここまで作成した状態で実行すると、起動時にキャラクターが生成されます。
追記
後で気が付いたのですが、GameModeに依存する処理(Cast)があると、GameModeを切り替えられないのでよくないですね。
GameModeにアクセスするためのインターフェースを定義してこれを経由するのがよさそうです。以下に実装例を示します。
・インターフェースIBP_Gamemodeを作成し、関数AddSpawnAreaを定義します。
・BP_SpwanAreaSetを以下のようにノードを修正します。
・BP_GameModeにAddSpawnAreaの実装を追加します。