『ピストル発射』です。ゲームアニメーションサンプルを改造して銃を構えたり発射できるようにしてシューティングアクション化していきましょう。
アセット調達
Lyraサンプルゲームプロジェクト
Lyraサンプルゲームのプロジェクトを開きます。ここから銃を撃つ関連のアセットを貰ってきましょう
ここから、ピストルとそれ関連のアニメーションと音をもらいます。
- Characters/Heroes/Mannequin/Animations/
- Weapons/Pistol/
- Audio/Sounds/Weapons/Pistol/
まず「ao mm pistol」で構えのポーズを検索して、見つかったものをすべて選択してから
右クリック>アセットアクション>移行 です
一見関係なさそうなものも移行対象になっていますが、これを動かすにはこれも必要といった依存関係があるので、詳しくないうちはあまり絞り込まないほうが楽です
フォルダの選択画面が出るので、
ゲームアニメーションサンプルをもとにしたプロジェクトのコンテンツフォルダを選びます
しばらく待つと取り込まれます
エラーが出ましたがあまり関係ないところなので無視します
次は「mm pistol fire」で銃を発射するアニメです
ちなみにMMをMFに変えると女性バージョンもあります
サムネ画像だと立っているだけですが
こんな感じで銃を撃つ瞬間のアニメーションです
あとその隣に銃自体のアニメーションもありますね
今回の説明ではこっちは使っていませんが、せっかくなのでこれももらっておきましょう
(これを持ってくると銃のスケルタルメッシュなどのアセットもついてくるので、アニメーションが必要ない場合もpistolのメッシュはもらっておきましょう)
2度目以降は、さっきもらった中に入っているものを上書きするか聞かれるので、すべてに適用でいいえを選びましょう
あとは音が欲しいので、好きな音をもらいましょう
私は「Weapons_Pistol_Sweetener_03」を選びました
もとのプロジェクトに戻りアセットを確認しましょう
コンパイルエラー解消 (※240801追記)
Lyraのプロジェクトから移行する場合に、アニメーション通知でコンパイルエラーとなる場合があります。
エラーが生じているままだとゲーム実行できないため、解決する必要があります。
一旦関数開始部分の実行ピンを切って、関数自体を何もしなくしておきましょう。
説明が漏れていました。すみませんm(_ _)m
アニメーションのリターゲット
銃をかまえるポーズは
Characters/Heroes/Mannequin/Animations/AimOffsets の中です
これは青いマネキンさん用なので、適当に1つ選んでいつものマネキンさん用にリターゲットしましょう。どれでもいいので右クリックからリターゲットを選びます
ターゲットにUEFNマネキンを選びます。自動でうまく変換できそうです
MMとかPistolで検索してアニメーションをすべて選択しましょう
今回は元となるマネキンさん用なので「アニメーションをエクスポート」です。
フォルダを選んで「エクスポート」しましょう。
出力先はわかりやすければどこでもOKですが、今回はフォルダを作ってそこに入れました。
オプションはそのままでいいです。
変換できました
アニメーションBPの編集
キャラクターのアニメーションBPを編集します。
アニムグラフは先日の記事で説明しました。
首をカメラの方向に向けるエイム処理があるので、この前後あたりに武器持ったエイムも追加しましょう
アニメーションレイヤーの作成
まずデフォルトスロット以降を右にずらしてスペースを確保しましょう
直接アニムグラフ上に処理を書いていくこともできますが、今後ピストル以外の処理を追加していくとだんだん大きくなっていくので、イベントグラフの関数と同様、「アニメーションレイヤー」という階層を作りましょう
名前はオーバーレイとしました
入力を受け取ります
できたレイヤーをアニムグラフに挿入します
では処理を作りましょう
ブレンドスペース
まずはCached poseで現在のアニメを一時保存します。
このあと複数回使うため分岐させたいのですが、アニメーショングラフでは線を分岐させることはできないのでキャッシュに一時保存します。
名前はわかりやすくしておきましょう
右クリックでいま付けた名前を入力するとそれを使う側のノードができます。
コピペでいくつか増やしておきます
ではここに武器をかまえるポーズをブレンドしていきましょう
ピストルのエイムオフセット流用作戦:失敗
AO_MM_Pistol_Idle_ADSというアニメーションオフセットをドラッグアンドドロップするとAnimOffset Playerというノードになります。
単純にこれを出力につなぐと常に銃をかまえちゃうので、エイム時のみブレンドするようにしましょう
それには頭のエイムオフセットで使っている「Blend Poses by bool」をコピペでOKです。
一番下の入力ピンがTrueの場合のみブレンドするというノードです。Enable_AOという関数と紐づけてあるので、近い視点のときはTrue側のポーズ、遠いカメラ視点のときなどエイムできないときはFalse側のポーズを再生する分岐になります。
条件成立時がかまえるポーズで、反対はもとのポーズをつなぎます
これで一旦実行してみると、
キャーー!ゴムゴムの、、、みたいになっちゃいました(;^ω^)
それは一旦おいておいて、終了するとエラーメッセージも出ています
これはブレンドポーズのノードでイナーシャリゼーションという慣性の設定がされているのに
それ使うためのケアが足りてないよというエラーです
頭の処理ではDead Blendingがそのケアをしていたので、コピペすれば終了時のエラーは消えます
このノードは実験的機能のため、この機能に依存するプロジェクトをシッピングすることはお勧めしません。
Unreal Engine のアニメーション ブループリントの Blend ノード | Unreal Engine 5.4 ドキュメンテーション | Epic Developer Community (epicgames.com)
もう一つの方法として、ブレンドポーズの初期設定では慣性のモードになっていないので、ここをスタンダード設定に戻す方法でも解消できます
その場合はさっき追加したDead Blendingは要りません
次にゴムゴム問題のほうですが、
これはリターゲット時に、アニメーションの加算関連の設定が引き継がれていないことが原因です
これらの設定を見てみると、加算しない設定になっていますが
もとのアニメーションを見てみると、こちらはメッシュ空間で加算する設定がされています
この情報がリターゲット時にうまく処理してもらえないようなので、自分で整備する必要があるようです。
プロパティマトリクスでまとめて変更できるようになったので、ある程度楽にはなっていますが
何をどう変更するかを把握して合わせこみが必要です
ここで何かミスっているのか、合わせたつもりがそれでもうまくいきませんでした。
ルートの点しかなくなっちゃいました
この原因を調べるよりもイチから作り直したほうがわかりやすいので、一旦この作戦はあきらめました
ブレンドスペースの作り直し:成功
頭のエイムオフセットは普通のブレンドスペースで作られていたので、これを複製してピストル用をつくります
サンプルの点をすべて消し、代わりにピストル用のエイムを置いていきます
- CCがセンターセンターで中央
- CDがセンターダウンで中央下向き
- 45がついているのはななめ45度用
- Lがレフトで左
- Rがライトで右
キャラの正面から見てるので逆に見えますが、キャラクタ側からのカメラに合わせるのでこれであっています
保存したらブレンドスペースは完成です
さっき失敗したアニメーションオフセットノードを消して、今作ったのを置きましょう
一旦これを直接つなぐと、銃をかまえたポーズで固定されました
カメラアングルに応答させる
カメラに応じてエイムさせましょう
カメラの回転を入力すればOKです。といってもカメラ自体の回転ではなくて、キャラクターの向きとの差分計算が必要です。
頭のエイム用にすでに計算してくれる関数「Get AOValue」があるので、この関数をつなぐだけでOKです
出力ピンを右クリックから分解し、Xがヨー軸、Yがピッチ軸なので平行につなげばよいです
歩きながら・しゃがみながらエイム
上半身だけ銃を構えさせたいです
そういうときは骨ごとにブレンドするノードを使います
「Layered blend per bone」です
もとの全身ポーズをベースに、かまえのポーズを上半身だけ置き換えます
「上半身に」はこのノードの設定でレイヤーセットアップのブランチフィルターを追加して
ここに骨の名前を設定します
上半身ならspine_01 か02 あたりです
ここの選択でも混ざり具合が変わるので実験してみてください
その下のDepthは混ぜる強さです
正の Blend Depth 値は、同じ数のボーンでウェイトをオフセットし、ボーン名 のチェーンでウェイトをテーパーします。たとえば、Blend Depth を 2 にすると、ブレンド ウェイト 1 が次の子ボーンに適用され、ブレンド ウェイト 0.5 が ボーン名 に適用されます。
Unreal Engine のアニメーション ブループリントの Blend ノード | Unreal Engine 5.4 ドキュメンテーション | Epic Developer Community (epicgames.com)
0か1だとその骨以下は置き換えになり、2だと次の骨が100%で指定した骨自体は50%の混ぜ具合みたいな感じですが、
公式の絵でPositiveとZeroの絵に差があまりなくて、わかったようなわからんような。
これだけを解説する記事があってもいい気がします。
これで構えつつ歩いたりしゃがんだりできるようになりましたね
好みですが、走ると横揺れが大きいかなと思います。
ここにチェックを付けてメッシュ空間で回転をブレンドする設定にすると、背骨の回転の混ぜ方が変わって姿勢が良くなります
どんなふうに調整したいか次第でお好みで
変更前のほうが走っているリアル感はありますかね
銃をもつ
ウエポンのピストルのところにメッシュがあるので、そのあたりにでもブループリントアクターを作成します。ここにさきほどのスケルタルメッシュを置いたら一旦OKです
弾丸を発射する処理とかはここに作ります
それは後回しとして、これをキャラクターのブループリントから持てるようにしましょう
Blueprints/CBP_SandboxCharacterを開きます
メッシュを選択してから追加で「Child」(子アクタコンポーネント)を出します
銃に限らず手に持つもの用なのでWeaponとかItemみたいな名前にします
ビューポートでみるとカプセルの下にありますが、これはメッシュのルートの位置です
親ソケットを右手「hand_r」と設定すると、手首の位置に起点が移動しました。
子アクタクラスにさきほど作った「BP_Pistol」をセットします
あとは向きや位置を調整します
アニメーションが動いていると調整しづらいので、Mesh の 詳細/Animation/Pose Anims で一時停止するとよいです
調整できたら一時停止を解除しないとゲーム中も止まったままなので注意
ちなみに、武器を持ち替えられるようにするには、
アクタクラスとセットで位置調整したトランスフォームを保管して、1番押したら銃をセットしつつ位置をセットという感じです
武器によってその位置や角度は変わるので、武器ごとにソケットを増やしていくよりは
トランスフォームを保存したほうがよいでしょう
これもそのうち記事書きますかね。
銃を発射
銃を発射するイベントを作りましょう
攻撃入力用の拡張入力を作成
Input/IA_Aim を複製し、名前は「IA_Attack」にしておきます
IA_Aimは押したときと離したときで両方イベントが発動しますが
攻撃は押したときだけでいいかなと思うので、ファイルを開いて「リリース」済を消しておきます
押すときと離すときで長押しを想定した弓系の武器とかを想定する場合はそのままにして、イベントグラフのほうで分岐してもOKです。
IMC_GDCMotionMatching マッピング設定(さきほど作った入力アクションとキーボードなどの実際のデバイスとの紐づけDB)に要素を追加します
一番下に枠が増えるので、IA_Attackを紐づけます。
その横の+で入力を追加して、マウスの左クリックを割り当てます
もうひとつ入力を追加して、ゲームパッドの右トリガーにも紐づけておきましょう
デバッグ用のウィジェットで左クリック押したときに右トリガーが光る設定がされているので
このサンプルではその組み合わせが想定されていそうです
変える場合はウィジェットのほうも改造しましょう
モンタージュ再生
キャラクターのブループリントで、イベントグラフを開きます。
適当な空きスペースに右クリックから「EnhancedInputAction IA_Attack」イベントを設置し、
ここに「Play Montage」で銃を撃つアニメーション「AM_MM_Pistol_Fire」を再生する設定をします
アニメーションモンタージュは「pistol fire」で検索するとよいでしょう
モンタージュがない場合はコンテンツブラウザ上で、アニメーションシーケンスを右クリックからモンタージュ化できます
再生するコンポーネント(In Skeltal Mesh Componentピン)はMeshをつなぎます
ちなみに、リターゲットキャラの場合、これをつなぎ変える処理は必要ありません
アニメーションはこのマネキンの動きを即座にモノマネする設定なので、
モンタージュでも自動的にモノマネします
ゲーム開始して、左クリックしてもアニメーションが再生されません
スロット変更し上半身だけ銃を撃つ
アニメーションモンタージュの再生スロットが、初期値のDefaultではなくFullbody~~になっています
これをDefaultスロットに変えると再生されます。
が、新しく上半身用のUpperBodyスロットをつくり、そこに再生するようにしてみましょう。
デフォルトスロットはトラバーサル動作で全身のアニメーション用に使われているので、そこに入力すると銃を撃つ瞬間にもしゃがみや走りがキャンセルされて棒立ちになっちゃうためです
次にアニメーションBPに移動し、UpperBodyスロットからのアニメを上半身に再生できるようにしましょう
全身をパルクール動作で上書きするよりも手前がいいので、その直前に追加します
設定をUpperBodyスロットに変えます
エイムと同じく上半身だけに混ぜる設定にします
やることは同じで一旦キャッシュして、「Layered blend per bone」で接続し
spine_01にDepth=1です。メッシュ空間での回転ブレンドもチェックつけておきます。
正面を向いているときは銃を撃てるようになりました。
トラブルシュート
しかし、横向いていてるときに銃を撃つとその向きではなく前向きになっています。
これは、エイムオフセットで向きを変えているのが、発砲のモンタージュに負けている状態ですね
このモンタージュのもとになっているアニメーションシーケンスで、加算の設定を見直してみます
加算しない設定になっているのをメッシュ空間、Selected Animation Scaledにかえると治りました
しかし、左手が安定しません。
ローカルに変えると高い方向ではまだもう少しずれが気になりますが、そこそこよくなりました。
YouTube動画ではここまでで根本解決していませんでしたが、できました。
最終的に、Base Pose Animationを「MM_Pistol‗Idle_ADS」ではなく、「MM_Pistol_Aim」に変更したらズレなくなりました。
Aimのアニメーションシーケンスは「AM_MM_Pistol_Fire」を複製して、1フレームだけを残せばつくれます。
AimオフセットとAimのポーズで、なぜか肘の角度がちがっていて、FireはAim姿勢からの動作として作られているのにIdleベースで加算の計算をしているのが原因でした。
もとがちがうけど、Idleベースで作られたエイムオフセットした姿勢の手の角度に、AimとFireの差分が追加されて、結果、うまいことエイムオフセットの姿勢で銃を撃つアニメーションが出来上がるという、なんだか難しいですね(^▽^;)
発砲音
最後に音を追加します。
アニメーションモンタージュにトラックを追加して、このモンタージュから直接音を鳴らしてみます
トラック上で適当に右クリックして「通知を追加」から「サウンドを再生」します
できた通知を0位置に合わせましょう
これの詳細欄に行き、「サウンド」のところに音を設定します
このように持ってきたままのサウンドウェーブを設定できますが,
「Meta Soundソース」にして音の調整を外からできるようにしたほうがよいです
(効果音の音量を設定メニューから一括で調整できるゲームがほとんどなので)
とりあえず今日はこのままにしておきます
これでモンタージュが再生されると音が鳴る仕組みができました
かまえてなくても撃って音がなるのはやめたい場合は、フラグでプレイモンタージュをしない分岐を作ればOKです
また、トラバースをキャンセルして発砲できる状態になっていますが、これもフラグみて分岐させてもよいと思います
あとはプレイデモのときは正面から見たときも銃をかまえていましたが、あれは、武器をもつのと構えた状態をカメラ切り替えとは別のキーに設定して、武器を持っているか否かの条件で分岐しています
リターゲットキャラへの適用
リターゲットキャラの玉ねぎちゃんでも見てみましょう
前回のカメラと同様まずアタッチからです
Blenderで作ってMixamoでリグを付けた手先のない玉ねぎちゃんはhand_rではなくてRightHandというのが右手の先です
ここに銃を持つように設定します
リターゲットキャラの玉ねぎちゃんのブループリントで、前回同様コンストラクションスクリプトに処理を追加しています
武器を持っていないときでもWeapon自体は常にある作りにしてある(子アクターコンポーネントを利用)ので、Weaponを「Tama」の「RightHand」にアタッチでOKです
ビューポートで位置調整をしておきましょう。
手が短くて銃があまり見えませんが、ちゃんとエイムできていそうです(ΦωΦ)フフフ…
つづく
次回はパルクール動作をいじってみましょう
コメント