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

◆弾が当たった時に音が鳴る

youtu.be

 

弾が体に当たったならズキュンバキュンと音を鳴らしたい。

ついでに、当たったら消えるようになっていてほしい。

 

やることはシンプルで、

Overlapした(重なった)時に弾から音が鳴って、

その後デストロイしてくれればいいわけだ。

というわけで以下のようなコードを追加する。

Cast To ThirdPersonCharacterは、

プレイヤーに当たったときにのみ反応するという条件だ。

f:id:happyherpy:20220118235542p:plain

上記の設定でもうまくいくが、動画中ではとある問題が発生している。

 

弾が生成と同時に消滅しているのだ。

なぜか?

Castによって対象を指定していない場合、

自分自身とオーバーラップしてしまうため、弾が出現と同時に消えてしまうのだ。

(自分のあたり判定Boxと、オブジェクトSphereがぶつかっている)

なので、

Sphere>詳細>コリジョンコリジョンプリセットを

NoCollision(衝突判定なし)にすることで、

自分自身に衝突することを回避している。

他にも、衝突の属性自体を細かく指定することでも

解決することができる。

 

◆弾を雨のように撃つ

ある一定の範囲にランダムに弾を生成しまくるBPを作成する。

youtu.be

まず初めに、Spawnを行うBPの板を作る。

BP>ブループリントクラス>Actor で

アクタを作成。名前は「BP_BulletRain」にでもしておく。

f:id:happyherpy:20220119001930p:plain

オブジェクトの中では

コンポーネントを追加 > box collision を選択。

雨が発生する天井として薄く引き伸ばす。

更に、方向を設定するArrowコンポーネントを追加。

向きは真下を指すようにしておく。

 

次にBPのイベントグラフを作っていく

まず、 スポーンアクタ を生成して

イベントTick と接続する。

スポーンアクタの生成物には「Bullet」を設定。

SpawnTransform(スポーンする座標)には、

Arowの位置を使用する。

f:id:happyherpy:20220119003335p:plain

これだと、弾はArrowの座標からまっすぐ落ちるだけとなる。

次に、Boxの範囲でランダムに発生するようになってほしい。

そこで使うのが

「Random Point In Bounding Box」という機能だ。

Boxコンポーネントの範囲からランダムに座標を取得する機能となる。

 

f:id:happyherpy:20220119003027p:plain

RandommPointInBoundingBoxにBoxコンポーネントの中心位置(GetWorldLocation)を

原点(Origin)として設定。

さらに、範囲(Extent)をBoxコンポーネントからGetBoxExtentで取得、

設定する。

これにより、Boxの範囲でランダムに弾を生成しまくるBPが完成したわけだ。

というわけで、こんな感じ。

なぜ弾がブドウのように大きいのか。それは謎だ。

f:id:happyherpy:20220119010430p:plain

 

◆ホーミング弾を作る

実は、ThirdPersonの位置を確認して弾をホーミングさせることもできる。

BP_Cannonに変数を追加(「NewVar0」が現れる)し、

オブジェクトタイプを「ThirdPersonCharacter」に設定し

Characterとして変数名を設定。

変数名横の目玉アイコンをクリックして、

開いた状態にしておく。

f:id:happyherpy:20220119014334p:plain

レベル上のアウトライナから

BP_Canonを選択し、

詳細 > デフォルト

が追加されているので、

そこのCharacterパラメータにThirdPersonCharacterを設定する。

f:id:happyherpy:20220119014448p:plain

同じように、BP_BulletにCharacter変数を追加。

ただしこちらは、目玉のアイコンが開いた状態で

変数>スポーン時に公開 を有効にする必要がある。

f:id:happyherpy:20220119014952p:plain

これを行うことで、

弾を生成するときにBP_Canon→BP_Bulletでパラメータを渡すことができる。

BP_Canonを開き、スポーンの値にcharacterを付与する。

f:id:happyherpy:20220119015145p:plain

そして、今度はBP_Bullet側にプレイヤーを追跡する仕組みを入れる。

CharacterからGetRootComponentを行い、

それをHomingTargetComponentに設定。

するとキャラクターの胸あたりが狙われるように設定される。

(ちなみに、キャラクターのmeshを指定すると、足元を狙われてしまう。

これはスケルタルメッシュの原点が足元であるため)

f:id:happyherpy:20220119014051p:plain

ちなみにホーミングの設定や、弾の寿命を設定することができる

 

・弾が何秒か後に消えるのを設定するのは

BP_Bullet(Self)>詳細>アクタ>Initial Life Span

を設定する。

f:id:happyherpy:20220119020245p:plain

 

・ホーミングの設定は

ProjectileMovement>詳細>ホーミング

から行える

 

ちなみに、「イベントEndPlay」を利用することで

弾が当たったり、時間切れで死んだときに演出を追加することも可能だ。

f:id:happyherpy:20220119020621p:plain

 

また、動画中では軌跡だけを残してきれいに消す方法に言及していた。

が、ちょっと複雑そうなので次回…

youtu.be