本日のテーマは弾丸発射&シャボン玉です
Game Animation Sampleを改造して、ピストルから弾丸を発射できるようにしたり、
しゃぼん玉飛ばして遊びましょう
ステップ1 発射イベント
キャラクターが弾を直接飛ばすのではなく、キャラクターが持っている銃のトリガーを引くことで銃が動いて弾を飛ばす作りにするのが自然な役割分担かと思います。
ピストルクラスにFireイベント追加
BP_PistolにFireイベントを用意して、ここで弾を発射しましょう。
BP_Pistolクラスを開き、Add Custom EventでFireイベントを作ります
ひとまず呼ばれたらデバッグ表示してみましょう。
表示は呼ばれてからなので、確認前に次に進みます。
キャラクタークラスからFireイベント呼出し
キャラクターのブループリントで攻撃のイベントを編集します
前回、Pistol_Fireのモンタージュ再生していたところの後ろでFire!とデバッグ表示している続きからです。
ここにBP_PistolのFireイベント呼び出しを追加しましょう。
これで、銃を撃つモーション → 銃から弾が跳ぶ 一連の動作ができます。
- Get Child ActorでWeaponにセットされている武器を参照して
- これがBP_Pistol クラスにキャスト成功したら
- そのファイヤーイベントを呼び出す処理
を追加します。
左クリックで発射すると、画面左上にFire!とBullet!がセットで表示されていますね
ちなみに上のほうが新しい情報なのでこの順番であっています
ステップ2 弾丸作成
ブループリントアクターBP_Bullet(弾丸)を作ります
(どこでもよいですがWeaponのフォルダにしました)
Lyraから弾のアセットを貰ってきてもよいですが、
今回はこのあとシャボン玉を作りたいのでメッシュはただの球とします
コンポーネント欄の追加から、球(Sphere)を追加します
これは結構大きく、直径1メートルあるので、ピストルの弾にするにはスケールをかなり小さくする必要があります
というのを勘で作って試すよりも、
一旦ピストルをコンテンツブラウザからドラッグで持ってきて、サイズ感を見比べながら編集したほうが楽です
これでもまだ穴より大きいですがピンポン玉サイズにしました
サイズ調整が済んだらピストルは消しましょう
次に自ら飛んでいく機能を付けましょう
projectileコンポーネント(投射物移動コンポーネント)というものです
投げられるものの動きをシミュレーションしてくれる仕組みです
これを弾に装備させると、銃はこの弾をスポーンするだけで、弾が自分で飛んでいく感じです
これで画面上のシミュレーションというボタンを押すと、ただ下に落下しました
投げられる力などの設定をしていないため、ただ重力落下しています
これを前に飛ばすための設定変更はステップ4で行います
ステップ3 弾のスポーン
銃のFireイベントで弾を出す
ピストルクラスにもどります
Spawn Actor from Classでさきほど作った弾BP_Bulletをスポーンさせましょう
とりあえずGet World Transformでこの銃自体と同じ位置に出してみましょう
トランスフォームというのは位置と回転とスケールの集合です。
同じ情報をそのまま使うということは、銃と同じ位置、回転、スケールで弾が作られます
参照相手が銃のメッシュか、BP_Pistolアクター本体かでも、位置とかスケールの意味が変わるのもご注意ください
その場で落ちるだけですが一応ちゃんと弾が出ましたね
発射後の使用済み薬きょうはこんなふうに落下させてもいいですね
弾が出る位置
無事に弾が出たところで、
銃の真ん中から弾が出るのは変なので、次は弾が出る位置を銃口の位置にずらしましょう
銃のメッシュを開きます
Lyraから貰ってきたピストルには、銃口部分に「Muzzle」という名のソケットがあります
このMuzzleって文字をコピーしてソケットのトランスフォームを取得すれば、
銃口の位置から弾が飛び出るということです
※ソケットを自分で作る場合はX軸の向きも大事です
Get Socket TransformのソケットにMuzzleを記載します。(間違えると正しく動作しないのでコピペ推奨)
ただし、ボーン名をコピーと違ってソケット名は変更しようとしないとコピれないらしいです
「ソケットをコピー」だと、ソケット名じゃなくて裏側の文字列(ソケット自体を複製するときに使うもの)をコピっちゃいます
Get World Transformと置き換えましょう
あとは、弾の側でトランスフォームをいじって銃口からの位置を微調整してもいいのですが、今回は少し大きい弾を出すので、銃口ソケット自体を動かしちゃおうかと思います
お好みで
ちょっと前に落ちるようになりました(後ろからの視点だと誤差レベルです)
ステップ4 弾の動き調整
ではBP_Bulletに戻って、銃らしく発射できるようにしていきましょう
基本的にはプロジェクタイルコンポーネントのパラメタです
初速
まず一番重要なのは初速ですね。ここが0だと重力だけです
基本的には赤いX軸の方向に向かって飛んでいきます。
それに加えて、重力で下向きに加速していくことで、放物線を描くというコンポーネントです
秒速400センチだと時速14キロでちょっと遅いですね
10倍して4000=時速140キロにしてみましょう。野球ぐらいの速度になりましたかね
あとはHitイベントを作って
ぶつかったら何かするとシューティングゲーム化完成です
よく使うパラメタ
「Projectile Gravity Scale」重力の影響度はそこそこよく使います。
一般に放物線を描くのは重力で下に引っ張られながら横に動くことでできる運動ですね。
逆にこれを0にすることで重力の影響をなくしてコントロールしやすくする使い方が多いのかなと。
あとでしゃぼん玉化でも触ります。
「ShouldBounce」跳ね返り設定は、チェックつけると跳ね返ります。
いや、跳ね返らない場合があります。次で説明します。
跳ね返りを有効にすると、その下にぶつかったときにうける摩擦抵抗などの設定があります。
ファイヤーボール作る記事で使用しています。
その他、ホーミング(ターゲットを追いかける)なんていう如何にもゲームらしいすごい機能もあります。
貫通問題の対策
一つ罠があって、スフィアのコリジョンを一旦BlockAllにしてみると、「全部ぶつかる」はずなのに、壁や地面に潜り込んじゃいます。
もっと細かくみると、キャラクターはぶつかるけど、壁や床はすり抜ける状態になっています
これはプロジェクタイルが微妙に強いせいです。
ブループリントアクターの一番上の親(ルート)を、デフォルトシーンルートからスフィアで置き換えてあげる(ドラッグ&ドロップ)と解決します
この状態になると、Sphereのコリジョン設定がプロジェクタイルの設定に対して優先されるので、プロジェクタイルの設定で「ShouldBounce」跳ね返る にしていれば地面や壁に跳ね返るようになります
兄弟関係のメッシュのコリジョン設定にはプロジェクタイルが勝っちゃうけど、
ルートになったメッシュのコリジョン設定には勝てないと。微妙にわかりづらいですね。
ステップ5シャボン玉化
アレンジ例としてシャボン玉化してみました。
動き方
初速
プロジェクタイルのInitial Speed初速を100cm/secまで落とし、ゆっくり前に進むようにします
風速1mくらいで前に進んでいくイメージです。
重力
次は重力設定を変えて上向きに動かします
プロジェクタイルの「Projectile Gravity Scale」がその設定で、
これをマイナスの値にすると上に加速していきます。
(レベルの重力設定自体と関連しますが一般に下向きの重力がかかっている前提)
-1だとちょっと速いので-0.5にしてみると、、、まだ速すぎたので-0.05倍にしました。
ちなみに、重力設定だとだんだん速く加速していきます。
等速で上にあがってほしい場合は回転でX軸を上にして、InitialSpeedで上向きにとばしつつ、重力影響は0にすると実現できるかなと思います。
時間で消える
消す条件設定をしてないので、いつまでも消えずに、撃つたびにアクターが増えてしまっています
アクター本体の設定で「Initial Life Span」寿命を設定しておきましょう
単位は秒なので10秒たったら勝手に消える設定です
サイズ
大きな球に変えます
メッシュのスケールを調整し、とりあえず大きく約2.5倍(≒直径2.5メートル)にしてみましたが、それでも大きすぎたので1mに戻しました。
BP_Pistolから発射するときに工夫して、サイズをランダム(発射時にばらつかせ)にしてみましょう
一旦線を切って、構造体ピンを分割します
位置と回転はいまのままでいいので再度つなぎなおして、
サイズを決めるスケールだけ掛け算を挟んでここに乱数(Random Float in Rangeで範囲指定)をつなぎましょう
掛け算の2番目の入力は右クリックで浮動小数点のスカラーに変えましょう
最小0.5から最大1とでも指定してみましょう
これで弾のサイズがばらつきます
最小をもっと小さくしてもいいですね
マテリアル設定
マテリアルの作成方法は記事をわけます。
ここではすでにできている前提でスフィアーのメッシュのマテリアル設定にマテリアルをセットします
半透明でエッジ部分が虹色に光りつつ、周囲がもやもや動いていますね
補足 カメラの回り込み回避
コリジョンがBlockAll設定だと、たとえ半透明であろうがSpringArmが縮んで自キャラがどアップになります。
回避したい場合は、一旦BlockAllにしたあとでカスタム設定にしてカメラをIgnoreにチェック(無視させる)とよいかと思います
以上です
コメント