UE4-动画/蒙太奇/融合(Animation/montage/blend)相关笔记

自己很少用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

猜你喜欢

转载自www.cnblogs.com/linqing/p/10233861.html