UEを学ぶ「オブジェクトの生成を学ぶ_4_spawnで弾を発射する_2」
◆弾が当たった時に音が鳴る
弾が体に当たったならズキュンバキュンと音を鳴らしたい。
ついでに、当たったら消えるようになっていてほしい。
やることはシンプルで、
Overlapした(重なった)時に弾から音が鳴って、
その後デストロイしてくれればいいわけだ。
というわけで以下のようなコードを追加する。
Cast To ThirdPersonCharacterは、
プレイヤーに当たったときにのみ反応するという条件だ。
上記の設定でもうまくいくが、動画中ではとある問題が発生している。
弾が生成と同時に消滅しているのだ。
なぜか?
Castによって対象を指定していない場合、
自分自身とオーバーラップしてしまうため、弾が出現と同時に消えてしまうのだ。
(自分のあたり判定Boxと、オブジェクトSphereがぶつかっている)
なので、
NoCollision(衝突判定なし)にすることで、
自分自身に衝突することを回避している。
他にも、衝突の属性自体を細かく指定することでも
解決することができる。
◆弾を雨のように撃つ
ある一定の範囲にランダムに弾を生成しまくるBPを作成する。
まず初めに、Spawnを行うBPの板を作る。
BP>ブループリントクラス>Actor で
アクタを作成。名前は「BP_BulletRain」にでもしておく。
オブジェクトの中では
コンポーネントを追加 > box collision を選択。
雨が発生する天井として薄く引き伸ばす。
更に、方向を設定するArrowコンポーネントを追加。
向きは真下を指すようにしておく。
次にBPのイベントグラフを作っていく
まず、 スポーンアクタ を生成して
イベントTick と接続する。
スポーンアクタの生成物には「Bullet」を設定。
SpawnTransform(スポーンする座標)には、
Arowの位置を使用する。
これだと、弾はArrowの座標からまっすぐ落ちるだけとなる。
次に、Boxの範囲でランダムに発生するようになってほしい。
そこで使うのが
「Random Point In Bounding Box」という機能だ。
Boxコンポーネントの範囲からランダムに座標を取得する機能となる。
RandommPointInBoundingBoxにBoxコンポーネントの中心位置(GetWorldLocation)を
原点(Origin)として設定。
さらに、範囲(Extent)をBoxコンポーネントからGetBoxExtentで取得、
設定する。
これにより、Boxの範囲でランダムに弾を生成しまくるBPが完成したわけだ。
というわけで、こんな感じ。
なぜ弾がブドウのように大きいのか。それは謎だ。
◆ホーミング弾を作る
実は、ThirdPersonの位置を確認して弾をホーミングさせることもできる。
BP_Cannonに変数を追加(「NewVar0」が現れる)し、
オブジェクトタイプを「ThirdPersonCharacter」に設定し
Characterとして変数名を設定。
変数名横の目玉アイコンをクリックして、
開いた状態にしておく。
レベル上のアウトライナから
BP_Canonを選択し、
詳細 > デフォルト
が追加されているので、
そこのCharacterパラメータにThirdPersonCharacterを設定する。
同じように、BP_BulletにCharacter変数を追加。
ただしこちらは、目玉のアイコンが開いた状態で
変数>スポーン時に公開 を有効にする必要がある。
これを行うことで、
弾を生成するときにBP_Canon→BP_Bulletでパラメータを渡すことができる。
BP_Canonを開き、スポーンの値にcharacterを付与する。
そして、今度はBP_Bullet側にプレイヤーを追跡する仕組みを入れる。
CharacterからGetRootComponentを行い、
それをHomingTargetComponentに設定。
するとキャラクターの胸あたりが狙われるように設定される。
(ちなみに、キャラクターのmeshを指定すると、足元を狙われてしまう。
これはスケルタルメッシュの原点が足元であるため)
ちなみにホーミングの設定や、弾の寿命を設定することができる
・弾が何秒か後に消えるのを設定するのは
BP_Bullet(Self)>詳細>アクタ>Initial Life Span
を設定する。
・ホーミングの設定は
ProjectileMovement>詳細>ホーミング
から行える
ちなみに、「イベントEndPlay」を利用することで
弾が当たったり、時間切れで死んだときに演出を追加することも可能だ。
また、動画中では軌跡だけを残してきれいに消す方法に言及していた。
が、ちょっと複雑そうなので次回…