C++でアニメーションノードを取得する

UnrealEngine

はじめに

※確認UEバージョン 5.0.3

C++ソースコード側でABP内のアニメーションノードを取得する方法について備忘録がてら解説します。

アニメーションノードを直接取得して、アニメーションシーケンスの再生時間をリセットしたり、再生シーケンスを変更することができます。

取得したいノードにタグ付けする

取得したいノードにタグ名を付けます。

アニメーションノードをクリックして詳細タブからTag箇所を編集してください。

タグ名はABP内でユニークな名前にする必要があります。

編集するとノード右下にタグ名が表示されます。

AnimInstanceクラスでノード取得関数を追加する

c++側にタグ名からノードを取得する関数を追加します。

FAnimSubsystem_Tagはタグが付いているアニメーションノードのタグ名とノードインデックスを保管しているアニメーションノードサブシステムです。

/**
 * @brief アニメーションノードをタグ名から取得する
 * @tparam T 取得したいAnimationNode型
 * @param InTagName 取得したいノードのタグ名
 */
template<typename T>
const T* GetAnimNodeByTag(const FName& InTagName)const
{
   if (const IAnimClassInterface* AnimBlueprintClass = IAnimClassInterface::GetFromClass(GetClass()))
   {
      if (const FAnimSubsystem_Tag* TagSubsystem = AnimBlueprintClass->FindSubsystem<FAnimSubsystem_Tag>())
      {
         const T* AnimNode = TagSubsystem->FindNodeByTag<T>(InTagName,this);
         return AnimNode;
      }
   }
   return nullptr;
}

template<typename T>
T* GetAnimNodeByTag(const FName& InTagName)
{
   return const_cast<T*>(static_cast<const UMyAnimInstance*>(this)->GetAnimNodeByTag<T>(InTagName));
}

作成した関数でノードを取得する

以下は呼び出し例です。

FAnimNode_SequencePlayer* SeqPlayerAnimNode = AnimInstance->GetAnimNodeByTag<FAnimNode_SequencePlayer>("TryGetNode");

	// 再生時間を初期化する
	SeqPlayerAnimNode->SetAccumulatedTime(0.0f);
タイトルとURLをコピーしました