はじめに
※確認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);