ビデオの内容紹介
前回、左マウスボタンを押してもパンチのアニメーションが動作しませんでした。今回は足りなかった設定を付け加え、さらに、アニメーションのブレンドを行うことによって、走りながらパンチできるようにします。
原題 Introduction to Third Person Blueprint game -20- Using Slot Nodes and Branch Points in UE4
[1] アニメーション グラフでパンチを設定する
前回までのアニメーション グラフは次のようになっていました。
Locamotion ステートマシンによって、最終ポーズが作られていました。パンチのアニメーション (PunchingMontage) はまったく入っていませんでした。そこで、PunchingMontage のデータを使ってアニメーション グラフの設定を修正 (追加) します。
そのためには、Slot を利用します。スロットは、モンタージュでは、複数のアニメーションから構成される単一のトラックでした。名前は UpperBody (上半身) でした。
それを利用するためにはスロット ノードを使います。
右下の [詳細] の [Settings] で、UpperBody を選びます。
すると次のように表示が変わります。
次のように接続してみます。
プレイして左マウスボタンを押すと、確かにパンチは繰り出されます。しかし、問題が2つほどあります。
1つは、下半身はまったく運動していないということです。滑るように移動するだけです。(下の画像では滑っている様子があまりよく分かりませんが、きれいに滑っています。)
もう1つは、左マウスボタンを放してもパンチが止まらないということです。まず、こちらの方から対処します。
原因は、次のように Punch イベントでボタンのリリースに何も対応していないためです。
パンチのアニメーションは 2 種類ありました。右手によるパンチ (Punch1) と左手によるパンチ (Punch2) です。これらを終わらせるには、そのためのアニメーションがありました。PunchEnd1 と PunchEnd2 です。つまり、Punch1 は PunchEnd1 にアニメーションを切り替え、Punch2 は PunchEnd2 に切り替える必要があります。そのためには、AnimNotify イベントを使います。正確には Branch Point (分岐点) です。
これは、サードパーソン ブループリント ゲーム入門 (17) スケルトンのリターゲットとモンタージュのセットアップで詳しく説明されています。要約すると、モンタージュ内のタイムラインで Branch Point が通過される毎に、そのためのイベントが発動して、何らかの動作をとります (下記参照)。そのイベントとつなげるための関数 Montage Set Next Section (モンタージュにおいて次に再生すべきセクションをセットする) を先に出しておきます。
つなげてみます。
先ほどの「イベント」とは、左側の青色で囲った部分です (下の方はまだ接続されていません)。カタカナで「ブランチ」とあるのは、まぎらわしいのですが、今回勉強している Branch Point とはまったく関係がありません。これまでにも何回か出てきた条件を分岐させて処理の方向を決めるノードにすぎません。
左から順番にどのようなことが行われているか見ていきましょう。
グラフの意味
AnimNotify_IsStillPunching1 というイベントが発生すると (つまり、モンタージュのタイムラインで、第17回の時に作った IsStillPunching1 という Branch Point が通過されると)、
「ブランチ」で IsPunching? という変数が true か false か判断され、true の場合 (つまりキャラクターがパンチしている状態、つまりプレイヤーが左マウスボタンをまだ押している場合) は、何もしません。false の場合 (つまりキャラクターがパンチしていない状態、つまりプレイヤーが左マウスボタンを放した場合) は、関数 Montage Set Next Section が起動して、Section Name to Change (変更すべきセクションの名前) に入れた Punch1 というアニメーションから、Next Section (次のセクション) に入れた PunchEnd1 というアニメーションに再生対象が変化します。つまり、後者が再生されることになります。なお、ここで言う「セクション」とは、アニメーションの区分けで、これも第17回で作りました。
下の方の AnimNotify_IsStillPunching2 についても同様に設定します。Ctrl+C、Ctrl+V でコピーペーストするのが楽です。
以上で、ボタンを放すとパンチのアニメーションも終わるようになりました。
[2] アニメーションをブレンドさせる
次に、パンチした時に下半身の動きが止まる問題を修正します。
そのためにはアニメーションのブレンドを利用します。アニメーションのブレンドは、2 つのアニメーションをその名のとおり混ぜ合わせることです。今回の場合は、Layered Blend Per Bone (ボーン単位によるレイヤー化されるブレンド) = 和名: [ボーンごとのレイヤードブレンド] を使います。これは、特定のボーンの集合に対してだけ作用するブレンドです。
次のように接続してみます。
右下の [Config] では、[Branch Filters] の +ボタンをクリックして、[Bone Name] に spine_01 をセットします。spine は背骨です。
spine_01 の手前には (少し見づらいですが) pelvis (骨盤) があります。つまり spine_01 は pelvis のすぐ上にあるので、「上半身」の部分のボーンの集合に対してブレンドをかけています。
ただし、このままでは動作しません。なぜなら、スロットの Source に接続すべき Locomotion が [ボーンごとのレイヤードブレンド] ノードに接続しているからです。この接続も外すことはできません。つまり Locomotion は1人2役できないのです。
そこで、Cached Pose (キャッシュされたポーズ) ノードを使います。
このノードを使うことによって、ステートマシンの結果 (ポーズ) はキャッシュに保存されることになります。キャッシュ ノードには LocomotionCache という名前を付けます。次に、それを変数のように、複数の場所でコピーして使ってみます。[キャッシュしたポーズを使用] を選択します。
全体を次のような構成にします。
グラフの意味
まず左上で、ステートマシン Locomotion のポーズが LocomotionCache に保存されます。それをコピーしたもの (キャッシュしたポーズを使用) ノードから、[ボーンごとのレイヤードブレンド] ノードの [Base Pose] に接続されています。つまり、Locomotion のポーズが基本となって、その上にブレンドをかけることになります。そのブレンドを行う (上書きする) アニメーションは、パンチのアニメーション ([スロット UpperBody] ノード) です。これが [ボーンごとのレイヤードブレンド] ノードの [Blend Pose 0] に接続しています。[Blend Weights] (ブレンドの重み) は 0.0 ならば [Base Pose] が 100% 生かされ、1.0 ならば [Blend Pose 0] が 100% 生かされることになります。最後にブレンドの結果を、[最終アニメーション ポーズ] に接続しています。
実際にプレイしてみましょう。
キャラクターは走りながら (泣きながら?) パンチしている様子が分かります。(この後、下に落下していきました。)
次回は、パンチに物理を適用します。おつかれさまでした。