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


    Q.定义状态机动画蓝图事件:

     

    Q.Animation/Montage指定帧触发事件(Event):

    (注意:单帧动画需要取消勾选Teleport to Explicit Time,否则无法触发帧事件)

    Q.C++自定义 Animation Blueprint(动画蓝图)

    自己很少用C++写Skeleton动画相关的逻辑,通常Anim的BP满足大部分需求,最多继承一个UAnimInstance封装一个通用基类,很少去自定义anim节点

    故留个C++实现备查.

    Note:AnimGraph属于Edtior模块,如果需要打包,需要注意下build.cs:

    https://github.com/Hethger/UE4_AnimGraphNode_Project_Template 

    build.cs主要片段:

            if (Target.Type == TargetType.Editor)
            {
                PublicDependencyModuleNames.AddRange(
                    new string[] 
                    {
                        "UnrealED",
                        "BlueprintGraph",
                        "AnimGraph"
                    });
            }

    AnimInstance 栗子:

    .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;
    };

     .cpp

    void UCppAnimation_Demonstrate::NativeInitializeAnimation()
    { Super::NativeInitializeAnimation(); }
    void UCppAnimation_Demonstrate::NativeUpdateAnimation(float DeltaTimeX) { Super::NativeUpdateAnimation(DeltaTimeX);
      //你的逻辑
    }

    Q.C++自定义 Animation Graph Node (动画节点)

      需要C++自定义动画节点的话,需要分别实现UAnimGraphNode_Base,和FAnimNode_Base的子类;

      UAnimGraphNode_Base用于在Editor里的定义一些节点的属性(如颜色/Category 名称/节点名等)

      FAnimNode_Base 里实现我们自己的动画逻辑

     栗子(PS:例子是没有实现任何功能的):

    AnimNode:

    .h

    
    

    #pragma once

    
    

    #include "CoreMinimal.h"
    #include "Animation/AnimNodeBase.h"
    #include "CppAnimNode_Demonstrate.generated.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

    #include "CppAnimNode_Demonstrate.h"

    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

    #pragma once

    #include "CoreMinimal.h"
    #include "AnimGraphNode_Base.h"
    #include "CppAnimNode_Demonstrate.h"
    #include "CppAnimGraphNode_Demonstrate.generated.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

    #include "CppAnimGraphNode_Demonstrate.h"

    #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

     

    Q.C++ 自定义State machine状态机

      wait

  • 相关阅读:
    Python基础入门:正则re.sub使用自定义替换方法
    Python基础教程:打印空行的三种方式
    python四种函数类型,必会知识
    写下三个面试遇到的问题
    Linux 部分运维记录
    Openstack安装记录
    关于subprocess的非阻塞问题的回答
    解决:共享文件夹关闭密码保护,还需要输入网络凭据
    无法加载文件XXX,因为在此系统上禁止运行脚本。有关详细信 息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=xxx
    intellij IDEA 全局搜索失效、搜索不到结果解决方法
  • 原文地址:https://www.cnblogs.com/linqing/p/10233861.html
Copyright © 2020-2023  润新知