エンジニアっぽくなりたい

UnityやUnrealEngine 4などでなにか役に立ちそうなことを発信していく。

UE4 AnimBPを使いまわす方法(2)~Animation Layerを使う~

以前に書いた「AnimBPを使いまわす方法」を見た友人から「Animation Layerを使うことで各子AnimBP毎のアニムグラフが設定できるよ!」という話をいただいたので、試してみようと思います。

前回の記事は以下
naoxgames.hatenablog.jp
これの続きで今回は対応していきます。




目標・要件


AnimBP継承先毎に固有のアニムグラフを設定できるようにする。

環境

・UE 4.26.1 (エンジンビルドはしていません)
・VisualStudio 2019 16.11.2


調べる

よくわからないので調べます。
Animation Blueprint Linking を使用する | Unreal Engine ドキュメント
これかしら?
「実験的機能」と表示されていてドキドキが隠せない。


やってみる

作戦としては、
継承元のAnimBPの変数にリンクする「AnimInstance」のクラスを指定できるようにして、継承先で必要な「AnimInstance」クラスを設定できるようにする。
あとはおおよそドキュメントに沿った対応をしてみる。
今回は簡単に、それぞれの固有のAnimBPの中でそれぞれのモーションをさせて、それをメインのAnimBPに反映させるようにしてみます。
なので、
・AnimationLayerには各キャラのモーションをさせる処理をする
・メインのAnimBPにはAnimationLayer+視線制御をさせる
となり、
AnimationLayerで設定したモーションをしつつ視線制御ができていたら成功!ということで。


Animation Layer Interfaceを作る

ドキュメントに倣って作ってみます。
コンテンツブラウザから右クリックをし、「アニメーション」→「アニメーションレイヤーインターフェーズ」を選択します。
f:id:naoxgames:20220211025337p:plain
ここでは「MyAnimLayerInterface」とします。

作成された「MyAnimLayerInterface」を開き、アニメーションレイヤー名を変更します。
ここでは「UniqueMotion」とします。
また、「入力」の「+」をクリックしてポーズの入力を追加します。
f:id:naoxgames:20220211025711p:plain


Animation Layer用AnimBPを作る

各キャラ用にAnimLayerのアニムグラフを書くAnimBPを作成します。
コンテンツブラウザから右クリックで「アニメーション」→「アニメーションBP」を選択します。
f:id:naoxgames:20220211030426p:plain
以下のような画面になるので、今回作ろうとしてるキャラのスケルトンを選択してください。
f:id:naoxgames:20220211030620p:plain
ここでは「ABP_UniqueMannequin」とします。

作成したAnimBPを開き、「クラス設定」を選択して詳細から「実装インターフェース」に「MyAnimLayerInterface」を追加します。
f:id:naoxgames:20220211030944p:plain

すると「アニメーションレイヤー」の項目に「UniqueMotion」が増えています。
f:id:naoxgames:20220211031022p:plain

UniqueMotionを開き、アニムグラフが開かれるのでそこでモーションをアウトプットへ繋げましょう。
f:id:naoxgames:20220211031154p:plain
私は適当にジャンプモーション設定しました。


このAnimBPを作成する手順をキャラ数分繰り返します。
今回作成したAnimBPは
「ABP_UniqueAnimal01」(鹿用)
「ABP_UniqueAnimal02」(豚用)
とします。


メインのAnimBPに設定する

メインのAnimBPで使えるようにします。
まずキャラのAnimBPの基底となっているAnimBPを開きます。ここでは「AnimBP_Base」と名付けています。
「クラス設定」から詳細で「実装インターフェース」に「MyAnimLayerInterface」を追加します。
f:id:naoxgames:20220211033524p:plain

先ほどと同じくアニメーションレイヤーに項目が追加されます。
f:id:naoxgames:20220211033722p:plain

アニムグラフで右クリック→「リンクされたアニメーションレイヤー」を選択
f:id:naoxgames:20220211033825p:plain

以下のようなノードができるので、詳細から「Layer」を「UniqueMotion」にします。
f:id:naoxgames:20220211033935p:plain

これによって、リンクされたAnimBPの「UniqueMotion」レイヤーを使えるようになります。

次にリンクするAnimInstanceのクラス指定をメインのAnimBPに追加しておきます。
以下のような変数をAnimBPに追加してください。
型はAnimInstanceのクラス参照型です。
f:id:naoxgames:20220211034239p:plain
ひとまずデフォルト値は「ABP_UniqueMannequin」にしておきます。


次に各キャラのメインのAnimBPを開き、「クラスのデフォルト」を選択して詳細から上の手順で追加した「LinkAnimInstClass」を設定します。
f:id:naoxgames:20220211034536p:plain
各キャラ用のAnimLayer用AnimBPを指定しましょう。


最後に各キャラのBPで以下のような処理を行います。
f:id:naoxgames:20220211035507p:plain
主に「AnimLayer用」の部分の処理になります。
SkeletalMeshComponentに先ほどのAnimBPで設定した「AnimLayer用AnimBP」のクラス参照を渡してリンクさせます。


実行!!!!!

以下のようになりました!


基底AnimBPで行っている共通処理を全キャラに反映しつつ、各キャラ毎の処理をAnimLayerのアニムグラフを使って行った感じです。
便利!!!


思ったこと

Mさん!これであってますか!?
実験的機能って書いてあったけど大丈夫なんですか!?
ひとまず要件はクリアして、動作も確認できてるのでよさそうだとは思います。




正しい対応方法やより良い方法があればご指摘お願いいたします!!!