完成イメージ
完成イメージはアイテムだと下のような感じ,
キャラクターだと下のような感じになります!
(敵キャラを召喚するシーンとかにどうでしょうか?)
環境
Unreal Engine 5.1.1(日本語)
BulePrint
BPは下のリンクからコピーできます.
時間がない人はコピペしてパラメータや変数をセットすれば動くようになってます!
はじめに
アイテムをランダムに沢山配置するだけのページは結構見つかったんですが
スポーンしたキャラクターのアニメーションが止まったりして
困ったので備忘録も兼ねて記事を書こうと思います!
目的
アクタ(アイテムなどのオブジェクト)やキャラクター(敵キャラなどの移動可能なMob)を
できるだけシンプルかつ簡単に指定した範囲にランダムに指定した数配置すること
方法
スポーンさせるキャラクタの用意
まずはコンテンツブラウザで右クリックしてブループリントクラスを選択します,

Characterを選択します.
動かないアイテムなどのオブジェクトの場合でもCharacterを選択することをオススメします!
コントローラ関連を簡単に済ませるため,この後でSpawn AIForm Classを使うためです.
自分で解決できる方はぜひActorなどで試してみてください!

今回は,キャラクタ(アニメーションつき)はMetaHumanを使って下のような感じに,

アイテムはCubeに光るマテリアルをセットして下のような感じにしてみました!

キャラクタやアイテムは自分で好きなものを用意してみてください!
ここまで出来たら次はスポーンエリアを決めるアクタを作っていきます.
スポーンエリアを決めるアクタの作成
まずはコンテンツブラウザで右クリックしてブループリントクラスを選択します,

アクタを作成します.

今回は名前をSpawnAreaとしました.

作成したアクタをダブルクリックして編集画面を開き,コンポーネントの追加からBox Collisionを追加します.

追加できたら一度コンパイルしましょう.
イベントグラフタブに移動してカスタムイベントを追加します.
カスタムイベントの名前はSpawnとしました.

スポーンするBPの作成
ここからがこの記事のメインになります!
オブジェクトやキャラクタをスポーンさせるためのSpawn AIForm Classノードを作成します.
Pawn Classには先ほど用意したCharacterオブジェクトをセットします.
Behacior Treeには今回は何もセットしません.
もしキャラクタの行動をセットしたい場合にはBehacior Treeに用意したものをセットします.

どこにキャラクタをスポーンさせるか決めるLocationにはアクタのBoxの内側の座標からランダムに選択することにします.
BoxCollisionコンポーネントからGetComponentBoundsノードで当たり判定を取得してRandompointBoundingBoxノードでランダムに一点の座標を選びます.
キャラクタのスポーンしたときの向きを決めるRotaionにはRandomRotatorノードでランダムな回転をセットします.
この辺りは用途に合わせて変更してみてください!

このままだと一回のイベントにつき1つのキャラクタしかスポーンしないのでループをつなげておきます.
LastIndexにお好みの回数をセットしてください.今回は5回にしました.

これでおおまかにキャラクタをスポーン出来るようになったのでイベントを呼び出す機能を作成してみましょう.
EventBeginPlayノードを引き出して,SetTimerByEventノードを繋げます.
今回は3秒に1回スポーンすることにしたいのでTimeに3.0をセットしておきます.
Eventを先ほど作成したSpawnAreaとつなげておきます.
あまり短い頻度でスポーンするようにするとエディタがかなり重くなるので気を付けてください!
上記のBPでキャラクタをスポーンさせていると,たまに指定した数より少ない数しかスポーンしません.
これは既にスポーンしているキャラクタとスポーン位置が被ったりしているときにスポーンしないようになっているためです.
スポーンに失敗したらリトライしてほしいので失敗したらループする機能を付けます.
まず,失敗した回数をカウントする変数を作成します.
今回はMissCountという名前を付けました.

Spawn AIForm ClassノードのあとにIs Validノードをつなげてスポーンしたオブジェクトが存在するか(=スポーンに成功したか)を確認します.
スポーンに失敗していたらMissCountをインクリメント(+1)します.
50回以上失敗しているとしたらスポーンするエリアが何かにふさがれているなど何かしら問題が起きていると判定してエラーメッセージを出力して次のループにいくようにします.

これでキャラクタをスポーンするアクタのBPが出来ました!
アクタの配置
キャラクタをスポーンさせたい位置に先ほど作成したSpawnAreaアクタを配置します.
ボックスのサイズを拡大してスポーンしてほしい範囲まで広げます.

これで完成です!実行してみましょう!
おわりに
最後まで読んでいただきありがとうございます!
初投稿なので色々足りない点があるかと思いますが,何か気づいことがあったらコメントや編集リクエストなどでコッソリ教えてください....
それから,Twitterをやってるのでもしよければフォローしていってください!
↓ 今回の記事の内容を実行したときのツイート
