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

摘要:
Q、 定义状态机动画蓝图事件:Q animation/Content指定帧触发事件(event):(注意:对于单帧动画,应取消选中TeleporttoExplicitTime,否则无法触发帧事件)Q C++自定义的AnimationBlueprint很少使用C++编写骨架动画相关逻辑。通常,Anim的BP满足大多数需求,最多继承一个UAnimInstance来封装一个公共基类,并且很少使用

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

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

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

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

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

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

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

免责声明:文章转载自《UE4-动画/蒙太奇/融合(Animation/montage/blend)相关笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在CMD上用telnet远程登录发送邮件测试记录对操作系统的理解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

react hook+antd实现点击发送验证码功能

要实现的效果如图,点击发送验证码,文字变为60秒后重新发送,并且开始倒计时 这是写成一个组件格式component -> eidtPass.tsx import React, { useState } from 'react'import { Modal, Form, Input, notification } from 'antd'import...

封装hiredis——C++与redis对接(一)(string的SET与GET操作)

  在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接。于是查询了一些资料,最后找到了hiredis。然而直接用它的话,难免有点不方便。于是,对其进行封装。   hiredis直接去git上克隆,地址:https://github.com/redis/hiredis。   下载好之后,由于其自带Makefile,只要make一下就编...

Qt之log数据展示模块简要实现

Log模块主要用于实时测井数据的显示和测后曲线数据的预览和打印,为更好的展示对Qt中相关知识点的应用,特以Log模块为例对其进行简要实现。 内容导图: 一、功能需求 1、界面效果图 Log模块实现曲线数据的显示及相关属性(曲线颜色、画笔类型、画笔宽度等)的设置 将上图划分为三个区域:右边为轨道信息显示和管理区,可以参看和设置相关轨道信息 左上为轨道的L...

对arcGis动态渲染标记点优化

import React from 'react'; import './index.less'; import { mapContext } from 'contexts/map'; import { Checkbox } from 'antd'; import esriConfig from 'gisConfig/esri.config'; impor...

Timeline v1.3.2 学习

https://docs.unity3d.com/Packages/com.unity.timeline@1.3/manual/index.html https://learn.unity.com/tutorial/timeline Timline overview Using the Timeline window Create a Timeline A...

C# 获取显示器的物理尺寸或分辨率

还是那个项目……还是那个领导……要求获取用户的显示器尺寸。一脸懵逼???还是照做…… 获取显示器的尺寸,有两种方法。第一种是通过查询注册表中,存储的指定显示器的相关信息;第二种是通过windows API 1、查询注册表中存储的显示器信息 /// <summary> ///获取显示器的相关硬件ID /// </summary> //...