UE5 武器の持ち替え

※本サイトはアフィリエイト広告を利用しています。

本日のテーマは武器の持ち替えです

動画でも解説しています。

ステップ1 装備状態の管理

武器の種類を管理するため『列挙型』を作りましょう
数字の代わりに名前を付ける仕組みです。

文字列や番号だと書き間違いミスがでやすいので、プログラミングの世界ではよく使います

名前は列挙(Enumerate)のEをつけて「E_WeaponState」とでもしておきましょう

+ボタンで3つ種類を作り

フリーハンドとピストルとライフル用にします

順番は何でもよいですが、一番上のが変数にするときのデフォルトになるので、素手かメインの武器にするのがおすすめかなと

  • 「Unarmed」武器ナシ
  • 「Pistol」ピストル
  • 「Rifle」ライフル

ではキャラクターのブループリントで、これを使って条件分岐を作りましょう

攻撃イベント

攻撃ボタンのイベントの最初で分岐を追加して、

列挙型専用の分岐処理Switchノードをつなぎます。

「E_WeaponState」で探すとフロー制御/Switch下にみつかります。
これは列挙子ごとの分岐が1つでできて便利です

よっしー
よっしー

逆に特定のやつだけ処理分岐したい場合はブランチがよいです

もとの処理はピストル発射用なので、Pistol出力(実行ピン)に繋ぎます
ほかの分岐も同じように、モンタージュ再生とファイヤーって処理にできればよさそうです

入力側は、ピンを右クリックから変数にして、それを見て分岐させましょう

名前は「WeaponState」武器状態としてみます(ご自由に)

持ち替えイベント

ではこの武器を持ち換える入力イベントを作りましょう

今回は簡単に1キーにします。拡張入力をきちんと作って管理する方法は以前の記事を参照ください。

1キーを押されたらWeaponStateをPistolに変えます

一旦、1キーを押すと持つ持たないをトグルするようにしておきます

FlipFlopノードです。これで1押すとA、次はB、Aと交互に動きます

B側をUnarmedで武器ナシに変えて完成です

あとで素手・ピストル・ライフルの持ち替えに強化します。

アニメーション

アニメーションBPにもこの状態を反映しましょう

まずはイベントグラフでキャラクターのWeaponState情報を受け取りましょう

アニメーション更新する処理の続きでよいかと思います

検証済のキャラクターから線を出してさきほど作ったWeaponStateを取得します

そしてこれをアニメーションBP上でも変数に昇格させて実行ピンをつなげばOKです

変数名は同じままでよいでしょう

Animグラフで頭のエイムオフセットの次に挿入したオーバーレイのレイヤーに移動します

以前の説明で銃をカメラのほうに向けるエイム処理と

着地時ローリングするときは構えない処理をしているところです

ここに列挙型で分岐する条件を追加しましょう

右クリックからWeaponStateにバインドします

状態ごとの入力ピンは、イベントグラフ用のスイッチと違って、右クリック一番下から必要なピンを自分で作ります

とりあえずピストル用のピンを作ってここにそれ用の処理をつなげばOKです

あとは後ろの選択ほど優先されるので、うまく自分のイメージ通りに加算できるように順番を設計しましょう

たとえば一旦エイムオフセットできる条件を無視して、ピストルだったら構えるポーズをブレンドすると、正面から見ようとすると顔を逸らすような動きになります。

これは、後ろ向けない範囲外でも銃を構えたポーズがブレンドされるため。

ブレンドしないデフォルト側をどの状態にするのがよいのか、その選択によって結果が変わるのでよく考えましょう

今度はWeaponStateがピストルでも構えなくなります。

Enable_AOがFalseだと構えない分岐の影響ですね

Enable_AOがFalseのときのポーズを、正面向きで銃を構えているポーズにすれば、今回のイメージに沿う動作にできそうです

ただしそのときも歩いたりはさせたいので、レイヤーブレンドの手前でEnable_AOの分岐をさせて

これをレイヤーブレンドに入力すると

下半身の動作はロコモーション動作で、上半身は1キーで銃を構える/構えない、期待通りのポーズになりました

銃を構えていないときはロコモーションだけで、しゃがみからの構えもよさそうです

ステップ2ライフル入手

Lyraからライフル関連のアセット調達

Lyraのプロジェクトからライフル関連のアセットを貰ってきましょう

コンテンツブラウザで欲しいものを選択して、右クリック/アセットアクショ/移行です

OKを押すとフォルダ選択画面が出るので、自分のプロジェクトのコンテンツフォルダを選択して

上書きをいいえ(または「はい」)で取り込まれます

ライフル関連でピストルと同じものを貰っています

コンパイルエラー解消

ゲームアニメーションサンプルに戻ってきました

まずは実行しようとするとコンパイルエラーが出る場合があるので

実行ピンの線を切って仮対処しましょう

これは弾のリロードアニメについてきたアニメーション通知です

一旦要りません

アニメーションのリターゲット

貰ってきたアニメーションのリターゲットもしておきましょう

以前の説明と同じため割愛します。

ちなみにアニメーション自体をリターゲットしているので、もとのアニメーションは必要なくなっているはずです。サイズ減らしたい方は削除可能です

が、ツインブラストとかのキャラクターがデータサイズ大きいので使わないならキャラクターを消したほうがかなり削減できます。
ウィジェットから消すのも忘れずに

エイムオフセットのブレンドスペース作成

次はライフルのエイムオフセットです。

※ ピストルの際にエイムオフセットがうまく合成できなかったので、ブレンドスペースで作成しています。

ピストル用のブレンドスペースを複製して、中身を入れ替えて作りました

ライフル用は斜め45度はないみたいですが、悪くなさそうです

ステップ3アニメーションの設定

ではまずアニメーションから用意しましょう

アニムグラフのオーバーレイレイヤーに

ライフルの分岐を作ります。ほぼピストルの分岐のコピペで作れます

まずピストルの処理をコメントで囲ってわかりやすくしましょう

これ全体をコピってライフル用を作ります

ウエポンステートの分岐にライフル状態を追加して、とりあえずつなぎましょう

これでライフルのときもピストルを構えるアニメーションがでます

あとは使うアニメーションを置き換えるだけです

エイムオフセットを作ったものに置き換えて、カメラが正面に回り込んだとき用のエイムは
ライフルの場合はアイドルADSでよさそうです

※なぜかコメント上に直接は置けません

キャラクターBPでWeaponStateを変更

1キーをピストルにしたのと同じく

2キーを押したらライフルにしましょう

とりあえずこれで切り替えできますが

ピストル持って2を押すとライフル持つ場合と素手になるときとあって
バグっぽい動作になっちゃうので

ピストル←→ライフルは素手にならずに持ち替えたいです

なのでフリップフロップはやめて条件分岐に変更します

このへんはやり方はいろいろあるのでお好みで

たとえば素手用のボタン作れば処理はもっと簡単で済みますね

見た目に差がなくてわかりづらいですが数値用のイコールと列挙型用のイコールは別です

そして別だけど列挙型全般用なので、条件はE_WeaponStateでリテラルなんちゃらというノードを使います

攻撃イベントのところで使ったスイッチ作戦もありですが、剣とか弓とか状態を追加するたびにここの接続も追加するのは忘れるとバグるので、一致不一致の2分岐がいいかなと思います

アニメーションの準備はできたので

次は武器アクターです

WeaponのチャイルドアクターにBP_Pistolをセットしています

このアクターを入れ替えます

Set Child Actor Classです

ステートがピストルの時にピストルのメッシュを付けて、素手のときはNoneにしておきます

ライフル側もコピペですが、ライフルのアクターをまだ作っていませんので、いったんなしで動作確認をしておきましょう

1キーで銃を構えて、再度1キーで解除できれば成功です。

ステップ4ライフルのBPアクター化

ピストルから武器への抽象化

ピストルとライフルって弾を飛ばす武器で共通点が多いので

もとのピストルを親クラスにして、共通のことは親クラスで、種類ごとの差分は個別のクラスで設定する作りとします

BP_WeaponBaseとでも改名しておきましょう

右クリックから「子ブループリントクラスを作成します」

とりあえずピストルはこれで一旦完成でよいです

ファイル名がもとのと同じファイルを作ると失敗する場合などがあるので、たまにリダイレクタ参照を更新をしておきましょう

同様にBPライフルも作ります

BPライフルを開くと、ピストルのスケルタルメッシュが設定されていますが

名前がSKピストルなのはイマイチなので、親クラスのほうで変えましょう

ぱっと思いつかないのでSKにしておきます

コンパイルして保存すると子クラスにも反映されます

するといつものビューポートやイベントグラフが消えました

「ブループリントエディタを開く」でOKです

SKのスケルタルメッシュアセットをライフルに変えましょう

ひとまず見た目がライフルになりました

一旦使ってみましょう

キャラクターBPから参照しましょう

ここでBPライフルをセットします

ピストル、ライフル、ともうまく出ましたかね?

位置が手とうまく合っていない件はステップ5で調整します。

弾の発射アレンジ

あとは動画最後でピストルからは1発、ライフルからは1回3発発射していますが

これはWeaponBaseのFireイベントを関数化して、子クラスでオーバーライド、つまり上書きできるようにして

キャラクターBPからは呼びなおしつつピストルだけでなくライフルの場合も呼び出すように配線してあり

これで一旦ピストルと同じ1発でる状態になります

そしてBPライフルでファイヤー関数をオーバーライドして

コピペで親と同じ処理を書いてから、しゃぼん玉サイズを小さくしたり、スポーン処理全体を3段に増やしています

ステップ5武器の持ち位置・種類管理

トランスフォームを武器ごとに変えたいです

武器ごとにソケットを分けて位置回転は0に統一する作戦もありですが

今回は武器リストに情報管理する作戦でやってみましょう

変数を作ります。名前はWeaponListとしました

フォートナイトの武器スロットのように番号と武器を紐づけて管理したいので、マップにして、中身は複数のデータをまとめて管理する仕組みを作りましょう(↑作って設定した後の図)

ブループリントの構造体アセットを作ります

StructのSをつけて「S_Weapon」とでも名付けましょう

構造体は複数のデータをツリー状に束ねた塊で、メンバー名とデータ型しか設定欄のないクラスです

武器の情報として管理したいのは、まずはウエポンステートで、
あとBPピストルやBPライフルなどのアクタのクラスとトランスフォーム情報です

ほかにも弾の種類とか弾の数とか、カラーバリエーションとかを管理してもよいと思います

またはWeaponBaseにこれらのデータを持たせる作戦もありですね

※構造体はデータだけをもつ簡単軽量なクラスです。

キャラクターBPにもどりましょう

一旦コンパイルしてデフォルト値を設定していきます

よっしー
よっしー

私はうっかり1番のピストルから作りましたが、
並び変えができないかもしれないので、0番から作ったほうがよいです

まずはピストルの位置回転をコピペします。要素を追加してライフル用の設定です

WeaponのChildアクタをライフルに変えて、

キャラクター本体のWeaponStateもライフルにして

揺れも邪魔なのでアニメーションをポーズして

これで位置合わせを行います。だいたいこんな感じで

このトランスフォームをコピペです

これでピストルとライフルの位置補正準備ができたので、持つときにこれを参照して適用しましょう

Weaponのトランスフォームですが、親のメッシュからの相対的な設定を変えたいので「Set Relative Transform」です

これにさきほど作った武器情報リストからFindで中身を取り出してピストルが1番ですね

ブレイクで構造体の要素を取り出してトランスフォームピン同士をつなぎます

WeaponStateやクラスもこれを参照する形でよくて、ピストルもライフルも素手も同じ処理なので、
関数にして処理を共通化しましょう

「関数に折りたたむ」です。関数名はChangeWeaponとしました

中に進みます

武器リストの番号を受け取ってその武器を手にあう位置で持つ関数ができました

キーがリファレンス渡しという設定になっちゃっているので、関数のインプットから解除します

Weaponのライフルは一旦消して、本体のWeaponStateは素手にして、メッシュのPose Animsを解除してと

うっかりアニメーションをポーズしたままだと動かないのでご注意を。

これでようやく準備完了です

リターゲットキャラ向け調整

これまで通りで、武器ごとの持ち位置調整をWeaponListに反映するだけです

本日の解説は以上です

おわりに

あとはChangeWeapon関数で武器を装備するモンタージュ再生するとか

1回で3発出すんじゃなくて長押しでボタン押している間連続発射できるようにするとか

ここまでついてこれた方ならそれほど難しくなさそうな細かい話をざっくり解説するかどうしようかなという感じです

ニーズがありそうなのは、

敵キャラNPCにトラバース動作させる方法とかかなと思いますが、敵AIはピンキリで対象者設定難しいなと。なのでこのシリーズはシーズン完としようかなと思っています

スーパー玉ねぎBros.を1面仕上げたらこれをベースにメサルギアソリッド作ってみようかなぁなんて

ご意見もお待ちしておりますm(_ _)m

コメント

タイトルとURLをコピーしました