UEを学ぶ「オブジェクトの生成を学ぶ_4_spawnで弾を発射する」

大砲的なものから弾を出す仕組みを作る

 

youtu.be

 

Spawnerを使って、弾を出す大砲を作ろう、

というもの。

 

◆大砲の弾を作る

早速BPで弾のアクタを作る。

 

右クリック>ブループリントクラス>Actor

でアクタを生成する。名前はBP_Bulletあたりに。

生成したアクタをダブルクリックして

コンポーネント画面を開き弾の形状を整える。

 

f:id:happyherpy:20211217005059p:plain

弾の形状の変形は画面右上の「オブジェクトを選択して拡大・縮小」を選択し、

オブジェクトの矢印を引っ張ったり縮めたりして行う。

 

f:id:happyherpy:20211217005612p:plain

これが、ちょうどいいサイズ感がなかなか難しく、

レベル上に配置して何度も確認した。

 

オブジェクトの構成も一工夫必要。

f:id:happyherpy:20211222012942p:plain

まず、アクタを一直線に飛ばすための機能である

Projectile Movementを追加する。

Projectile Movement>詳細 からSpeedを設定することで、

その速度で弾が移動する。

また、Projectile Gravity Scaleが設定されていると、

重力に引っ張られて弾が落ちてしまうため

0に設定する。

f:id:happyherpy:20211222013525p:plain

 

ただし、これだけだと弾の尖っている方が先頭にするというのが難しい。

まずは

Projectile Movement のRotation Follow Velocityを有効にしておく。

これを有効にしておくと、進んでいる方向に向かってアクタの位置を調整するため

常にまっすぐ弾が進む。(らしい)

 

また、このままでは弾の向かう方向が設定されていないため、

Arrowコンポーネントを追加する。

Arrowコンポーネントの矢印の先端に合わせて、アクタが向きを合わせてくれる。

 

ここまで設定することで、「まっすぐ進む弾」が完成した。

 

最後に、SphereがBox Collision下に入るようにして、

当たり判定を設定する。

 

f:id:happyherpy:20211222014804p:plain

黄色い箱が当たり判定になる。

いい具合になるようにサイズを調整していく。

 

追加したBox > 詳細 >コリジョン

で、コリジョンアセットを設定。

動画中では、まずはまずはBlock All Dynamicに設定していた。

これを設定すると、何にでも衝突するので、跳ね返ってくる

f:id:happyherpy:20211222015701p:plain

なぜ跳ね返ってくるのか?

それはProjectile Movement のShould BounceがONになっているからである。

大砲の弾としては、

上記項目は不要なのでOFFにしておこう。

 

すると、弾は反射せずに刺さる(壁で停止する)ようになる。

 

これで弾の完成だ。

 

◆大砲を作成する

 

同じように

右クリック>ブループリントクラス>Actor

アクタを作る。名前はBP_Canonに。

 

作ったアクタをダブルクリックで開いて、作成を開始する。

 

f:id:happyherpy:20211222020852p:plain

 

アクタの見た目は適当にありものを使う。

コンポーネントを追加 > Static Mesh

で、コンポーネントを追加し、

「詳細」からサンプルから大砲っぽいモデルを配置する。

 

f:id:happyherpy:20211222021011p:plain

 

次に「一定間隔で弾を撃つ」という挙動を付与する。

イベントグラフタブへ移動

f:id:happyherpy:20211222021331p:plain

今回は「イベントTick」を利用した実装を行う。

 

Tickとは、毎フレーム実行するイベントである。

「常に〇〇をする」というものだと思っておけばよい。

 

次に、「クラスからアクタをスポーンする」を追加する。

そして、クラス名に「BP_Bullet」を設定すると、

ノード名が「SpawnActor BP Bullet」となる。

 

が、これだけだとエラーが出る。

Spown Transformに生成する位置を設定する必要があるのだ。

ノード内のSpawnTransformを右クリック > 構造体ピンを分割

で内部要素をLocation,Rotation,Scaleの3つに分割する。

 

f:id:happyherpy:20211222022416p:plain

 

この時、座標の設定はそのままBP_Canonの位置を使うことができない。

ノード中のCollision Handling Overrideが有効になっており、

自身の座標を発射位置にすると、弾の登場位置に大砲があって

スポーンできないというわけだ。

 

f:id:happyherpy:20211222022913p:plain

大砲から発射する弾の向きと位置を設定するため、

コンポーネントの追加 > Arrow

を追加する。

 

作成したArrowをイベントグラフ上にドラッグ&ドロップ

GetWorldLocationノードを追加し、

Arrowの座標を取得して、Spown Transform Locationに接続する。

 

これでともかく弾が出るはず…!なのですが、

これで実行すると弾同士が干渉して弾が出現しないです

f:id:happyherpy:20211222023631p:plain

BP_Bulletのあたり判定を「OverlapAllDynamic」として

弾がぶつからないようにしよう。

 

更に一座標同様に、

GetWorldRotationでArrowの向きを取得。

これでようやく、意図通りの方向に弾を撃てるようなった。

弾の感覚が短いと感じた場合

「イベントTick」の詳細 > アクタティック > Tick Interval(secs)を

1にしておこう。

これは処理を何秒ごとに行うか?の設定であり、

弾を発射する間隔を広くしたのだ。

 

f:id:happyherpy:20211222025035p:plain

残像みたいになっているのが大砲の弾である。

 

最後に、大砲発射時にSEをつけていく必要がある。

※ちなみに、UE4は「wav」ファイル形式しか対応していないため

 mp3が使えないとのこと。

 

f:id:happyherpy:20211222025303p:plain

Spawn Sound at Locationを追加し、

Spawnactorの末尾に接続。

Volume Multipulirのパラメータでいい感じにサウンドを調整したら完了だ!

(ちなみに、弾側のイベントBeginに音を設定しても、同様の結果になる。

 これは、大砲が弾を生成した時にBeginで音を鳴らすため、

 タイミングが実質同じになるためだ)