マルチスレッドアニメーションとアニメーションレイヤーを用いて、走りのロコモーションを実装する。
AnimationBlueprint を作成
AnimationBlueprintを新規作成し、「ABP_Base」と命名する。
「CH_Player」の [Mesh] を選択し、[Animation] > [AnimClass] を「ABP_CharacterBase」に設定する。
「ABP_CharacterBase」の AnimGraph を開き、[StateMachine] を追加して「SM_Locomotion」と命名し、[OutputPose]とつなげる。
「SM_Locomotion」の中に入り、下のようにステートを組む。
AnimationLayer を作成
AnimationLayerInterfaceを新規作成し、「ALI_AnimLayer」と命名する。
4つの AnimationLayer を作成する。
コンパイルして保存する。
AnimationBlueprint で AnimationLayer の設定
AnimationBlueprint「ABP_CharacterBase」を開く。
[ClassSettings] > [Interfaces] > [ImplementedInterfaces] > [Add] から「ALI_AnimLayer」を選択し、コンパイルして保存する。
[AnimGraph] > [SM_Locomotion] > [Idle] を開き、[MyBluprint]パネルから「FullBody_IdleState」をドラッグ&ドロップして [OutputAnimationPose] につなげる。
[Run_Start]、[RunCycle]、[RunStop]も同様に行い、コンパイルする。
AnimNode関数の実装
AnimationBlueprint「ABP_CharacterBase」の [ANIMATION LAYERS] > [Full Body Idle State] を開く。
「Sequence Player] ノードと [Output Pose] ノードをつなぐ。
[Sequence Player] > [Details] > [Functions] > [On Become Relevant] > [Create Binding] から関数を作成し、「SetUpIdleAnim」と命名する。
「On Become Relevant」は、ノードに関連性が生じたときに呼び出される。
関数のカテゴリを「AnimNodeFunctions」にする。
以下のように関数を組む。
[FullBody_IdleState] > [Sequence Player] > [Detail] > [Settings] > [Sequence] の値を「Dynamic Value」に変更する。
武器レイヤーの作成
新しいAnimationBlueprint「ABP_Combat」を作成する。
そして先ほど作成した「ABP_CharacterBase」を継承させる。
[Class Defaults] > [Details] > [Anim Set Idle] > [Idle Hip Fire] に使いたいアニメーションをセットする。
レイヤーを指定するロジックを組む(仮)
レイヤーを指定するロジックを組む。
ここでは、仮組みしてものを記載する。
そして実行すると、「ABP_Combat」で定義したアニメーションが再生される。
「Run_Start」「Run_Cycle」「Run_Stop」についても同様に作っていく。
アニメーションの遷移ルールを作する
「ABP_CharacterBase」の [FUNCTIONS] > [Override Function] > [Blueprint Thread Safe Update Animation] から関数を作成する。
UpdateRotationData関数を作成し以下のように設定する。
そして以下のようにBPを組む。
※スレッドセーフな関数では、GetActorLocationなどは使えない。[Property Access]を使う。
同様にして「Update Velocity」関数も作成する。
そして「Blueprint Thread Safe Update Animation」関数を編集する。
「Idle」⇒「Run_Start」の遷移を定義する。「HasVelocity」がTrueなら遷移するようにする。
「Run_Start」⇒「Run_Cycle」の遷移を定義する。「Run_Start」のアニメーションが終わったら自動で遷移すればいいので、[Automatic Rule Based on Sequence Player in State] にチェックを入れる。
同様に他の遷移も定義する。