AnimGraphの最上位階層のノードネットワークのうち、緑色のグループであるLayer Blendingの内容について記載します。

Layer Blendingグループの全体像

Layer Blendingグループは、BaseLayer、OverlayLayer、BasePosesの3つのレイヤーをLayerBlendingというレイヤーでブレンドしています。
ブレンドにはAnimation Blueprint Linkingの機能を使用しています。ここでは関数のようなものと思ってもらえれば大丈夫です。
BaseLayer

BaseLayerによって、そのキャラクターの通常状態でのアニメーションを決定します。
例えばそのキャラクターが武器を持ったり傷を負ったりするとアニメーションが変化するような仕様の場合、それらはここでは計算しません。
BaseLayerの中身はボリュームが大きいので、詳細は別記事に分けました。
OverlayLayer

OverlayLayerは、BaseLayerで決定した素の状態のアクションに対して、状態を上書きするためのアニメーションを決定するレイヤーです。
キャラクターの状態によっては、特定の体の部位を別のポーズにさせたいことがあります。例えば銃を持っているときは両腕を胸の前で銃を持っているように固定させたいですし、左腕を負傷しているときは左手は下にだらんと下り、右手は左腕をかばうようなポーズが考えられます。
ALSのデフォルトのアニメーションブループリントではサンプルとして下図のような多くのOverlay Statesを用意し、Enum(列挙型)で切り替えられるようにしています。

したがって、自身のゲームでキャラクターの状態によってポーズやアニメーションをブレンドする場合、OverlayLayerにブレンドするアニメーションを追加することになります。
サンプルとして用意されている各ステートの実装は、それぞれ大きく異なるのでここでは紹介しきれませんが、豊富に用意されているので自分で追加する際に参考になりそうです。

Overlayのステートマシンの外には、[Inertialization]というノードに繋がれています。

これはOverlayのステート遷移に慣性ブレンドを使用するためのものです。詳細は以下のリンクにまとめました。
BasePoses

BasePosesはプレイヤーの状態のポーズを決定します。
サンプルで用意さている、ALS_N_Poseは通常の立ち状態で、ALS_CLF_Poseは左足を立てたしゃがみです。
LayerBlending
3つのレイヤーでそれぞれ決定したアニメーションを、LayerBlendingという名前のアニメーションレイヤーにてブレンドしていきます。

複雑なノードネットワークになっていますので一つずつ見ていきます。
Inputs

まずは先程の3つのレイヤーアニメーションがInputとして入ってくるので保存しておきます。
Make Dynamic Additives from Base Layer

BasePosesとBaseLayerによって加算ポーズを作成します。その際にメッシュスペース版とローカルスペース版を作成しておき、部位ごとにどちらを使うか選択します、
ローカルスペースは銃を構えたときなどに腕の向きをコントロールするために使われます。
Create layers from different body sections

まず、足、腰、背骨、頭、左腕、右腕の6部位を個別に現在のポーズを作成します。
アニメーションシーケンスに設定されたアニメーションカーブによってLayerAnimationを使用するかどうかを切り替えます。

LayerAnimationを使用しない場合は、BaseLayerのアニメーションをそのまま使用します。
LayerAnimationを使用するようにアニメーションカーブの値がセットされている場合は、OverlayLayerに対して先程[Make Dynamic Additives from Base Layer]で作成した加算ポーズをブレンドし、その結果を使用します。
また、OverlayLayerの後ろのSlotは部位に対してアニメーションを割り込ませたい場合(リロードなど)に使うことを想定しています。
Blend layers together

作成した各部位のポーズをブレンドしていきます、
ただし、腕(Arm)に関しては先程述べたように、銃を構えている時などキャラクターの姿勢ではなく向きに影響されたいことがあります。その際にはメッシュスペースではなくローカルスペース用の加算ポーズを使用します。
Blend AnimCurves from both layers together and override previous layer interference

LayerBlendingの最後に、とあるボーンに対してBaseLayerとOverlayLayerをブレンドしています。

そのボーンの名前は[VB Curves]といい、これはスケルトンアセットのRoot直下に追加した仮想ボーンです。

この仮想ボーンはキャラクターのアニメーションには一切関与しないダミーボーンですが、このボーンに対してBaseLayerとOverlayLayerのアニメーションカーブの値をブレンドしています。
このような処理が必要な理由としては、部位ごとのブレンド処理の際にレイヤーが干渉し合ってアニメーションカーブが取得できなくなってしまうため、アニメーションの影響を受けない仮想ボーンに対して、最後に両方のレイヤーの値を上書きすることで正しくアニメーションカーブが参照できるようになるそうです。
わかったようなわからないような感じですが、この処理を外すと下図のような挙動になるので、まあそういうことなのでしょう!


重要なのは、この仕組によって自身で用意したスケルトンアセットを使用する場合は、[VB Curve]という仮想ボーンを追加する必要があります。
最近のコメント