PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

UE4 指定範囲内にActorを配置するBP

目次

・Spawnerの作成
・指定範囲にSpawnさせる方法

環境

・Unreal Engine4.16

Spawnerの作成

まずはSpawnerとなるBlueprintを作成します
親クラスはActorを選択しました。

ConstructionScriptにChildActorComponentの追加とChildActorComponentに設定するクラスを設定します。
f:id:PaperSloth:20170704230345p:plain


今回は図のようなStaticMeshだけが配置されたActorBPを使用します。
f:id:PaperSloth:20170704230241p:plain

先程のSpawnerのBPに設定します。
この時に"Instance Editable"にチェックを入れておきましょう。
Levelに配置後に任意のActor継承クラスを設定出来るようになります。
f:id:PaperSloth:20170704230608p:plain

ここまでで下記のように生成されることが確認できると思います。
f:id:PaperSloth:20170704230726p:plain


続いて、同一のActorクラスが複数生成されるように変更を加えます。
・ForLoopとSpawnNumを追加しました。
SpawnNumにはとりあえず10を入れました。
先程同様に"Instance Editable"にチェックを入れておきましょう。
f:id:PaperSloth:20170704231405p:plain
f:id:PaperSloth:20170704231519p:plain

また、Actorが複数生成されているか確認するために適当に250ずつ高さをずらしています。
とりあえず10個生成されていることが確認できました。
f:id:PaperSloth:20170704231713p:plain


試しにLevelに配置されたBPの値を変更してみてください。
・SpawnNumの数を変える
・ActorClassのStaticMeshを変えてみる。またはActorClassの指定を変えてみる。
Actorの派生クラスも使用可能なため、Characterクラスも指定可能です。
f:id:PaperSloth:20170704232015p:plain

指定範囲にSpawnさせる方法

今回は2種類のアプローチを書きます。

①距離、高さの上限を決めてその範囲内で生成する

まずはランダムで回転角を決めます。
最大角度のみ指定しておけば良いでしょう。
また、回転の方向もYawのみにしています。Roll, Pitchもランダムで指定したい場合は稀でしょう。
f:id:PaperSloth:20170704232602p:plain

次に生成させる位置を決める計算の元となるベクトルを生成します。
最大距離と最低、最高の高さを決めましょう。
f:id:PaperSloth:20170704233740p:plain


先程のノードと合わせてみましょう。
変更点は赤枠で囲っています。
SpawnNumという名前に対して生成される数が1つ多く感じてしまう紛らわしい名前だったため、LoopのStartIndexを1に変更しました。
あとは先程作成したノードを組み合わせているだけです。
f:id:PaperSloth:20170704234005p:plain


最大距離:1000
最低高さ: 0
最大高さ:1000
最大角度: 360
で設定した結果以下のようになりました。
f:id:PaperSloth:20170704234137p:plain

ConstructionScriptで実行しているため、移動したり実行したりするたびに違う結果となるでしょう。


②BoxCollisionを置いてその範囲内で生成する

まずはBoxCollisionを追加します。
サイズは適当にBoxExtentXYZを500にしています。
f:id:PaperSloth:20170704234451p:plain


次にBoxの範囲内でのランダムなベクトルの取得を行います。
内部の計算としては
Origin - BoxExtent を最小
Origin + BoxExtent を最大
とした範囲でXYZ成分の乱数を生成してベクトルとして返しているだけで非常にシンプルな実装です。
f:id:PaperSloth:20170704235711p:plain


あとは先程同様にノードをつなぎます。
f:id:PaperSloth:20170704235641p:plain


今回はBoxが地面に埋まる範囲にあったため、埋まってしまいました
f:id:PaperSloth:20170704235859p:plain

ですが先程の距離と高さでの実装に比べて生成される範囲が目に見えて分かりやすいため、汎用性が高いです。
また、flagをひとつかませてBoxでの生成と距離、高さ指定での生成方法を共存させてしまってもいいかもしれません。



ConstructionScriptを活用すれば色々なテストが楽に行なえますし、現場でのゲーム開発にも活かせる便利な機能を沢山作れるでしょう。
f:id:PaperSloth:20170705000735p:plain