自己很少用C++写骨骼动画相关的逻辑,通常BP满足大部分需求,这里留个底备查.
1.C++自定义 Animation Blueprint(动画蓝图)
栗子:
.h
UCLASS(transient, Blueprintable , hideCategories = AnimInstance, BlueprintType ) class BJ_3DDESIGNAPP_API UCppAnimation_Demonstrate : public UAnimInstance { GENERATED_BODY() public: //初始化虚函数 virtual void NativeInitializeAnimation() override; //tick event virtual void NativeUpdateAnimation(float DeltaTimeX) override; protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CppVariant") float Speed = 0.0f; };
.cppvoid UCppAnimation_Demonstrate::NativeInitializeAnimation()
{ Super::NativeInitializeAnimation(); } void UCppAnimation_Demonstrate::NativeUpdateAnimation(float DeltaTimeX) { Super::NativeUpdateAnimation(DeltaTimeX);
//你的逻辑
}
2.C++自定义 Animation Graph Node (动画节点)
需要C++自定义动画节点的话,需要分别实现UAnimGraphNode_Base,和FAnimNode_Base的子类;
UAnimGraphNode_Base用于在Editor里的定义一些节点的属性(如颜色/Category 名称/节点名等)
FAnimNode_Base 里实现我们自己的动画逻辑
栗子(PS:例子是没有实现任何功能的):
AnimNode:
.h
USTRUCT(BlueprintType) struct BJ_3DDESIGNAPP_API FCppAnimNode_Demonstrate : public FAnimNode_Base { GENERATED_USTRUCT_BODY() public: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Links) FPoseLink BasePose; public: virtual void Initialize_AnyThread(const FAnimationInitializeContext& Context) override; virtual void CacheBones_AnyThread(const FAnimationCacheBonesContext& Context) override; virtual void Update_AnyThread(const FAnimationUpdateContext& Context) override; virtual void Evaluate_AnyThread(FPoseContext& Output) override; virtual void GatherDebugData(FNodeDebugData& DebugData) override; // Constructor public: FCppAnimNode_Demonstrate(); };
.cpp
FCppAnimNode_Demonstrate::FCppAnimNode_Demonstrate() { } void FCppAnimNode_Demonstrate::Initialize_AnyThread(const FAnimationInitializeContext & Context) { BasePose.Initialize(Context); } void FCppAnimNode_Demonstrate::CacheBones_AnyThread(const FAnimationCacheBonesContext & Context) { BasePose.CacheBones(Context); } void FCppAnimNode_Demonstrate::Update_AnyThread(const FAnimationUpdateContext & Context) { EvaluateGraphExposedInputs.Execute(Context); BasePose.Update(Context); } void FCppAnimNode_Demonstrate::Evaluate_AnyThread(FPoseContext & Output) { BasePose.Evaluate(Output); } void FCppAnimNode_Demonstrate::GatherDebugData(FNodeDebugData & DebugData) { FString DebugLine = DebugData.GetNodeName(this); DebugData.AddDebugItem(DebugLine); BasePose.GatherDebugData(DebugData); }
AnimGraphNode:
.h
UCLASS()
class BJ_3DDESIGNAPP_API UCppAnimGraphNode_Demonstrate : public UAnimGraphNode_Base
{
GENERATED_UCLASS_BODY()
private:
//注意,自定义的Anim Node类,逻辑都在里面
UPROPERTY(EditAnywhere, Category = "Settings")
FCppAnimNode_Demonstrate Node;
public:
//节点颜色
virtual FLinearColor GetNodeTitleColor() const override;
//提示内容
virtual FText GetTooltipText() const override;
//节点名称
virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override;
//Category 分类名称
virtual FString GetNodeCategory() const override;
};
.cpp
#define LOCTEXT_NAMESPACE "LQ"
UCppAnimGraphNode_Demonstrate::UCppAnimGraphNode_Demonstrate(const FObjectInitializer& ObjectInitializer)
:Super(ObjectInitializer)
{
}
FLinearColor UCppAnimGraphNode_Demonstrate::GetNodeTitleColor() const
{
return FLinearColor::Green;
}
FText UCppAnimGraphNode_Demonstrate::GetTooltipText() const
{
return LOCTEXT("hello_ue4_animation ", "hello_ue4_animation ");
}
FText UCppAnimGraphNode_Demonstrate::GetNodeTitle(ENodeTitleType::Type TitleType) const
{
return LOCTEXT("HandleCharacterHeight", "HandleCharacterHeight");
}
FString UCppAnimGraphNode_Demonstrate::GetNodeCategory() const
{
return TEXT("CppCustomNode");
}
#undef LOCTEXT_NAMESPACE
3.C++ 自定义State machine(状态机)
wait
UE4-动画/蒙太奇/融合(Animation/montage/blend)相关笔记
原文:https://www.cnblogs.com/linqing/p/10233861.html