UE4 C++编写自定义动画蓝图节点

news/2024/5/19 18:36:35/文章来源:https://blog.csdn.net/grayrail/article/details/129965729

UE中自带的动画蓝图节点有限,在实现一些功能时需要通过C++编写一些自定义的动画蓝图节点,本文就来讲解其基础实现,自定义节点最终效果如下:
在这里插入图片描述
源文件下载:https://download.csdn.net/download/grayrail/87654290

1.流程简介

自定义动画蓝图节点并不像扩展蓝图那样方便,需要编写AnimNodeGraphAnimNode两个类,分别负责编辑器绘制与具体执行,逻辑关系如下:
在这里插入图片描述
AnimGraphNode中存放AnimNode的字段,UE会去找对应的AnimNode,AnimNode里存放动画蓝图暴露在编辑器上的可编辑字段。

2.编写AnimGraphNode

我们使用UE4.27版本,并继承AnimNode的Skeletal中间基类,方便处理骨架逻辑。
首先来编写AnimGraphNode:


MyAnimGraphNode.h

#pragma once#include "AnimGraph/Classes/AnimGraphNode_SkeletalControlBase.h"
#include "MyAnimNode.h"
#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "MyAnimGraphNode.generated.h"UCLASS(MinimalAPI)
class UMyAnimGraphNode : public UAnimGraphNode_SkeletalControlBase
{GENERATED_BODY()public:// UEdGraphNode interfacevirtual FText GetNodeTitle(ENodeTitleType::Type titleType) const override;virtual FText GetTooltipText() const override;// End of UEdGraphNode interfaceprotected:// UAnimGraphNode_SkeletalControlBase interfacevirtual FText GetControllerDescription() const override;virtual const FAnimNode_SkeletalControlBase* GetNode() const override { return &Node; }virtual void Draw(FPrimitiveDrawInterface* PDI, USkeletalMeshComponent* previewSkelMeshComp) const override;// End of UAnimGraphNode_SkeletalControlBase interfaceprivate:UPROPERTY(EditAnywhere, Category = Settings)FMyAnimNode Node;};

MyAnimGraphNode.cpp

#include "MyAnimGraphNode.h"
#include "Components/SkeletalMeshComponent.h"#define LOCTEXT_NAMESPACE "UMyAnimGraphNode"FText UMyAnimGraphNode::GetControllerDescription() const
{return LOCTEXT("MyAnimNodeDesc", "My Anim Node Desc");
}FText UMyAnimGraphNode::GetNodeTitle(ENodeTitleType::Type titleType) const
{return LOCTEXT("MyAnimNodeTitle", "My Anim Node Title");
}FText UMyAnimGraphNode::GetTooltipText() const
{return LOCTEXT("MyAnimNodeTooltip", "My Anim Node Tooltip");
}void UMyAnimGraphNode::Draw(FPrimitiveDrawInterface* PDI, USkeletalMeshComponent* previewSkelMeshComp) const
{}#undef LOCTEXT_NAMESPACE

上述脚本逻辑主要定义编辑器外观、颜色等信息,注意头文件上的FMyAnimNode Node字段,定义该字段才会找到对应的AnimNode。

2.编写AnimNode

该节点负责编写动画蓝图节点内的具体逻辑、暴露编辑器下的修改字段等。


MyAnimNode.h

#pragma once#include "AnimGraphRuntime/Public/BoneControllers/AnimNode_SkeletalControlBase.h"
#include "BoneContainer.h"
#include "BonePose.h"
#include "CoreMinimal.h"
#include "MyAnimNode.generated.h"USTRUCT(BlueprintInternalUseOnly)
struct MYPROJECT_API FMyAnimNode : public FAnimNode_SkeletalControlBase
{GENERATED_BODY();
public:FMyAnimNode();//输出调试信息virtual void GatherDebugData(FNodeDebugData& debugData) override;virtual bool NeedsOnInitializeAnimInstance() const override { return true; }//更新逻辑virtual void EvaluateSkeletalControl_AnyThread(FComponentSpacePoseContext& output, TArray<FBoneTransform>& outBoneTransforms) override;//验证是否可以执行更新逻辑virtual bool IsValidToEvaluate(const USkeleton* skeleton, const FBoneContainer& requiredBones) override;private://初始化骨骼时调用virtual void InitializeBoneReferences(const FBoneContainer& requiredBones) override;UPROPERTY(EditAnywhere)FBoneReference TargetBone;
};

MyAnimNode.cpp

#include "MyAnimNode.h"
#include "Animation/AnimInstanceProxy.h"
#include "AnimationCoreLibrary.h"
#include "AnimationRuntime.h"FMyAnimNode::FMyAnimNode()
{
}void FMyAnimNode::GatherDebugData(FNodeDebugData& debugData)
{FString DebugLine = debugData.GetNodeName(this);DebugLine += "(";AddDebugNodeData(DebugLine);DebugLine += FString::Printf(TEXT(")"));debugData.AddDebugItem(DebugLine);ComponentPose.GatherDebugData(debugData);
}void FMyAnimNode::EvaluateSkeletalControl_AnyThread(FComponentSpacePoseContext& output,TArray<FBoneTransform>& outBoneTransforms)
{check(outBoneTransforms.Num() == 0);const FBoneContainer& boneContainer = output.Pose.GetPose().GetBoneContainer();const FCompactPoseBoneIndex boneCPB = TargetBone.GetCompactPoseIndex(boneContainer);if (boneCPB == INDEX_NONE) return;FTransform boneTransform = output.Pose.GetComponentSpaceTransform(boneCPB);boneTransform.SetScale3D(FVector::ZeroVector);outBoneTransforms.Add(FBoneTransform(boneCPB, boneTransform));outBoneTransforms.Sort(FCompareBoneTransformIndex());
}bool FMyAnimNode::IsValidToEvaluate(const USkeleton* skeleton, const FBoneContainer& requiredBones)
{if (TargetBone.IsValidToEvaluate()) return true;return false;
}void FMyAnimNode::InitializeBoneReferences(const FBoneContainer& requiredBones)
{TargetBone.Initialize(requiredBones);
}

3.配置build.cs

依赖项参考了其他动画蓝图节点的配置,可能有冗余:

using UnrealBuildTool;public class MyProject : ModuleRules
{public MyProject(ReadOnlyTargetRules Target) : base(Target){PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;PublicDependencyModuleNames.AddRange(new string[]{"Core","CoreUObject","Engine","InputCore","HeadMountedDisplay","AnimGraph","AnimGraphRuntime","BlueprintGraph"});}
}

最后编译即可。
上述节点执行后将对选中的骨骼,设置缩放为0。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283776.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 服务器 docker 安装 mysql 8.0.32 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker 镜像 https://registry.hub.docker.com/_/mysql/tags 1.版本号可不写 不写就是最新版本 最好写上 docker pull mysql:版本号2.查看镜像是否安装成功 如下图 docker images3.创建文件…

活动送票福利|Jina AI x PyCon US 2023!

作为一家总部位于德国柏林的国际化公司&#xff0c;Jina AI 拥有来自 10 不同国家的团队成员&#xff0c;在中国&#xff08;北京、深圳&#xff09;、美国&#xff08;圣何塞&#xff09;均设有办公室。全球化基因深植于 Jina AI 团队&#xff0c;我们也非常注重国际化社区的建…

shardingsphere-jdbc 整合 springboot

shardingsphere官网地址 https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/sharding/ 当前我们演示的是水平分表 1、基础环境配置以及依赖管理 1.1 创建数据库表结构 CREATE TABLE address_0 (id bigint(…

linux 服务器 docker 安装 jdk jre java 1.8 环境 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker jdk 镜像 https://hub.docker.com/_/java/tags 1.下载JDK镜像 注&#xff1a;后面如果不写版本的话 就是最新版 建议写上 docker pull java:8u111-jdk2.查看镜像是否下载成功 docker…

家装产业的数字化,正在成为越来越多人的新共识

一场数字化的浪潮&#xff0c;正在各行各业上演着。家装行业&#xff0c;亦不例外。可以说&#xff0c;家装产业的数字化&#xff0c;正在成为越来越多人的新共识。如何借助数字化的手段改造家装行业&#xff0c;如何乘着数字化的东风实现家装行业的全面转型升级&#xff0c;正…

CF区间DP作业题解

1. Recovering BST 由于互质关系不是传递的&#xff0c;所以尽量挂在树的最下面&#xff0c;刚好构成二叉树 f[i][j][0]f[i][j][0]f[i][j][0] 表示区间 [i,j][i,j][i,j] 以 iii 为根&#xff0c;是否可以构成一棵树。 f[i][j][1]f[i][j][1]f[i][j][1] 表示区间 [i,j][i,j][i,j…

基于非线性权重因子和纵横交叉策略的麻雀搜索算法

目录 1 主要内容 非惯性权重模型 纵横交叉策略模型 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序参考文献《基于Sobol序列和纵横交叉策略的麻雀搜索算法》对麻雀搜索算法进行改进&#xff0c;实现了基于纵横交叉策略和非线性权重因子的麻雀搜索算法 改进SSA算法【…

webpack配置本地TypeScript编译环境和开启本地服务

目录 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 3.安装webpack 4.配置webpack.config.js文件 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 执行npm init&#xff0c;文件命名为ts_demo&#xff0c;然后一直回车。 3.安装…

ImageIO 支持webp格式

TwelveMonkeys 提供了很多图片格式的支持&#xff0c;其中也包括了webp&#xff0c;但是其仅支持webp格式的读取&#xff0c;不支持webp格式的写出&#xff0c;这样的话如果想把图片转换成webp格式的图片就没办法实现了&#xff1b;下面我们使用 webp-imageio-core 对ImageIO图…

关键词采集工具可以帮助我们做那些方面的工作

针对搜索引擎的关键词采集工具可以帮助我们做那些方面的工作&#xff0c;至少从10个工作场景说明&#xff0c;并列举详细的使用场景 Msray-plus&#xff0c;是一款企业级综合性爬虫/采集软件。 支持亿级数据存储、导入、重复判断等。无需使用复杂的命令&#xff0c;提供本地W…

ROS实践01 C++ Python基本实现

文章目录运行环境&#xff1a;1.1 vscode 环境配置&#xff1a;1&#xff09;ctrlshiftX 添加扩展插件&#xff1a;2&#xff09;ctrlshiftB 配置中更换为以下代码1.2 C代码实现1&#xff09;工作空间创建和编译2&#xff09;功能包创建和添加依赖3&#xff09;新建.cpp文件4&a…

新电脑装机——配置硬件、软件安装卸载、注册表、路径——介绍详解

装机工具、配置、路径&#xff0c;介绍详解电脑配置信息电脑历史记录黑色Window Top 加入黑色&#xff08;微信不能调成黑色背景&#xff09;edge浏览器的配置&#xff08;被edge恶心过的必看&#xff0c;有方法解决edge被管理、不能新建标签&#xff09;设置【地址栏搜索】&am…

多元函数的基本概念——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是多元函数的基本概念&#xff0c;下面&#xff0c;让我们一起进入多元函数的世界吧 平面点集 多元函数的概念 多元函数的极限 多元函数的连续性 有界闭区域上多元连续函数的性质 平面点集 第一个是坐标平…

RocketMQ 事务消息 详解

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年4月9日 &#x1…

RSA非对称加密算法原理和代码实现 信息安全 密码学

一 欧拉数论定理 1. 欧拉函数 设n为一正整数&#xff0c;则欧拉函数φ(n)\varphi (n)φ(n)等于0∼n−10\sim n-10∼n−1中与n互素的整数个数 比如φ(5)4\varphi (5) 4φ(5)4&#xff0c;因为0~5中&#xff0c; 1,2,3,4均与5互素&#xff0c;即最大公约数为1 2. 欧拉定…

采集工具助力市场营销,让您的营销更加高效

随着市场竞争的日益激烈&#xff0c;企业的营销策略也在不断升级。而在这个信息爆炸的时代&#xff0c;采集数据成为了市场营销中不可或缺的一环。为了更好地服务客户&#xff0c;我们公司开发了一款高效、快捷的采集工具&#xff0c;为您的营销活动提供有力支持。 Msray-plus&…

计算机网络习题 | 第一章:计算机网络概述

文章目录概述1、以下关于OSI环境中数据传输的过程的描述中&#xff0c;错误的是&#xff08; &#xff09;2、以下关于广域网 WAN 特点的描述中 &#xff0c;错误的是&#xff08; &#xff09;3、以下关于计算机网络定义的描述中&#xff0c;错误的是&#xff08; &#xff09…

【分布式 论文】之 1. MapReduce——Simplified Data Processing on Large Clusters

文章目录1. 需求 / 现存问题2. 总述3. 实现3.1 概述1. 需求 / 现存问题 输入数据通常很大&#xff0c;为了在合理的时间内完成计算&#xff0c;必须将计算分布到数百或数千台机器上。 如何并行化计算、分发数据和处理故障等问题使得原本简单的计算变得晦涩难懂&#xff0c;需…

chatGPA的主要功能-chatGPT深度分析

ChatGPT功能介绍 ChatGPT是基于深度学习技术的自然语言处理算法&#xff0c;其主要用途是生成自然语言文本&#xff0c;能够应用于多个自然语言处理任务。以下是其主要功能介绍&#xff1a; 文本生成&#xff1a;ChatGPT能够生成高质量的自然语言文本&#xff0c;可以应用于大…

Mybatis-plus学习2

一、Mybatis-plus分页操作 1.配置拦截器即可 //分页插件Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();} 2.直接使用Page对象 //测试分页查询Testpublic void testPage(){//参数一&#xff1a;当前页//参数二&#xff1a;页面…