UEを学ぶ「オブジェクトの生成を学ぶ_4_spawnで弾を発射する」
大砲的なものから弾を出す仕組みを作る
Spawnerを使って、弾を出す大砲を作ろう、
というもの。
◆大砲の弾を作る
早速BPで弾のアクタを作る。
右クリック>ブループリントクラス>Actor
でアクタを生成する。名前はBP_Bulletあたりに。
生成したアクタをダブルクリックして
コンポーネント画面を開き弾の形状を整える。
弾の形状の変形は画面右上の「オブジェクトを選択して拡大・縮小」を選択し、
オブジェクトの矢印を引っ張ったり縮めたりして行う。
これが、ちょうどいいサイズ感がなかなか難しく、
レベル上に配置して何度も確認した。
オブジェクトの構成も一工夫必要。
まず、アクタを一直線に飛ばすための機能である
Projectile Movementを追加する。
Projectile Movement>詳細 からSpeedを設定することで、
その速度で弾が移動する。
また、Projectile Gravity Scaleが設定されていると、
重力に引っ張られて弾が落ちてしまうため
0に設定する。
ただし、これだけだと弾の尖っている方が先頭にするというのが難しい。
まずは
Projectile Movement のRotation Follow Velocityを有効にしておく。
これを有効にしておくと、進んでいる方向に向かってアクタの位置を調整するため
常にまっすぐ弾が進む。(らしい)
また、このままでは弾の向かう方向が設定されていないため、
Arrowコンポーネントを追加する。
Arrowコンポーネントの矢印の先端に合わせて、アクタが向きを合わせてくれる。
ここまで設定することで、「まっすぐ進む弾」が完成した。
最後に、SphereがBox Collision下に入るようにして、
当たり判定を設定する。
黄色い箱が当たり判定になる。
いい具合になるようにサイズを調整していく。
追加したBox > 詳細 >コリジョン
で、コリジョンアセットを設定。
動画中では、まずはまずはBlock All Dynamicに設定していた。
これを設定すると、何にでも衝突するので、跳ね返ってくる
なぜ跳ね返ってくるのか?
それはProjectile Movement のShould BounceがONになっているからである。
大砲の弾としては、
上記項目は不要なのでOFFにしておこう。
すると、弾は反射せずに刺さる(壁で停止する)ようになる。
これで弾の完成だ。
◆大砲を作成する
同じように
右クリック>ブループリントクラス>Actor
アクタを作る。名前はBP_Canonに。
作ったアクタをダブルクリックで開いて、作成を開始する。
アクタの見た目は適当にありものを使う。
コンポーネントを追加 > Static Mesh
で、コンポーネントを追加し、
「詳細」からサンプルから大砲っぽいモデルを配置する。
次に「一定間隔で弾を撃つ」という挙動を付与する。
イベントグラフタブへ移動
今回は「イベントTick」を利用した実装を行う。
Tickとは、毎フレーム実行するイベントである。
「常に〇〇をする」というものだと思っておけばよい。
次に、「クラスからアクタをスポーンする」を追加する。
そして、クラス名に「BP_Bullet」を設定すると、
ノード名が「SpawnActor BP Bullet」となる。
が、これだけだとエラーが出る。
Spown Transformに生成する位置を設定する必要があるのだ。
ノード内のSpawnTransformを右クリック > 構造体ピンを分割
で内部要素をLocation,Rotation,Scaleの3つに分割する。
この時、座標の設定はそのままBP_Canonの位置を使うことができない。
ノード中のCollision Handling Overrideが有効になっており、
自身の座標を発射位置にすると、弾の登場位置に大砲があって
スポーンできないというわけだ。
大砲から発射する弾の向きと位置を設定するため、
コンポーネントの追加 > Arrow
を追加する。
作成したArrowをイベントグラフ上にドラッグ&ドロップ
GetWorldLocationノードを追加し、
Arrowの座標を取得して、Spown Transform Locationに接続する。
これでともかく弾が出るはず…!なのですが、
これで実行すると弾同士が干渉して弾が出現しないです
BP_Bulletのあたり判定を「OverlapAllDynamic」として
弾がぶつからないようにしよう。
更に一座標同様に、
GetWorldRotationでArrowの向きを取得。
これでようやく、意図通りの方向に弾を撃てるようなった。
弾の感覚が短いと感じた場合
「イベントTick」の詳細 > アクタティック > Tick Interval(secs)を
1にしておこう。
これは処理を何秒ごとに行うか?の設定であり、
弾を発射する間隔を広くしたのだ。
残像みたいになっているのが大砲の弾である。
最後に、大砲発射時にSEをつけていく必要がある。
※ちなみに、UE4は「wav」ファイル形式しか対応していないため
mp3が使えないとのこと。
Spawn Sound at Locationを追加し、
Spawnactorの末尾に接続。
Volume Multipulirのパラメータでいい感じにサウンドを調整したら完了だ!
(ちなみに、弾側のイベントBeginに音を設定しても、同様の結果になる。
これは、大砲が弾を生成した時にBeginで音を鳴らすため、
タイミングが実質同じになるためだ)