ue5 自定义蓝图节点(一)

继承于U2KNode的类,调用蓝图函数库内的方法,这里写了多输出引脚,但是没有测试具体输出哪个引脚。

.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "K2Node.h"
#include "MyNode.generated.h"/*** */
UCLASS()
class NEWCOUSTNODE_API UMyNode : public UK2Node
{GENERATED_BODY()public:// //鼠标放到上面的说明/注释// virtual FText GetTooltipText()const override;// //节点名称// virtual FText GetNodeTitle(ENodeTitleType::Type TitleType)const override;// //将节点添加到蓝图视图// virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegister)const override;// //蓝图节点的标签// virtual FText GetMenuCategory()const;// //展开节点// virtual void ExpandNode(FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph)override;// //分配默认引脚// virtual void AllocateDefaultPins()override;// //引脚更改时会调用// virtual void PinDefaultValueChanged(UEdGraphPin* ChangedPin)override;// //连接情况更改以后// virtual void NotifyPinConnectionListChanged(UEdGraphPin* Pin)override;//// //创建一个可视小部件来在图形编辑器或图形面板中表示这个节点。如果没有实现,则将使用默认的节点工厂// virtual TSharedPtr<SGraphNode> CreateVisualWidget() { return TSharedPtr<SGraphNode>(); }// // 为表示此节点的小部件创建背景图像// virtual TSharedPtr<SWidget> CreateNodeImage() const { return TSharedPtr<SWidget>(); }// //右键菜单, 比如添加RemovePin// virtual void GetNodeContextMenuActions(class UToolMenu* Menu, class UGraphNodeContextMenuContext* Context) const override;//鼠标放到上面的说明/注释virtual FText GetTooltipText() const override { return FText::FromString(TEXT("This node is used for everyone to learn")); }//节点名称virtual FText GetNodeTitle(ENodeTitleType::Type TitleType) const override { return FText::FromString(TEXT("My Node")); }//蓝图节点的标签virtual FText GetMenuCategory() const { return FText::FromString(TEXT("This is My ClassMenu")); }//重写UK2Node的GetMenuActions函数,使其可以在右键菜单里找到这个蓝图节点virtual void GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const override;//分配默认引脚virtual void AllocateDefaultPins() override;//节点调用函数virtual void ExpandNode(FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph)override;};

 .cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "NewCoustNode/Public/MyNode.h"#include "BlueprintActionDatabaseRegistrar.h"
#include "BlueprintNodeSpawner.h"
#include "K2Node_CallFunction.h"
#include "KismetCompiler.h"
#include "MyBlueprintFunctionLibrary.h"//通用,可以固定格式
void UMyNode::GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const
{Super::GetMenuActions(ActionRegistrar);UClass* ActionKey = GetClass();//ActionRegistrar需要includeif (ActionRegistrar.IsOpenForRegistration(ActionKey)){//UBlueprintNodeSpawner需要includeUBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass());check(NodeSpawner != nullptr);ActionRegistrar.AddBlueprintAction(ActionKey, NodeSpawner);}
}void UMyNode::AllocateDefaultPins()
{Super::AllocateDefaultPins();//创建输入引脚CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Execute);//创建输出引脚01UEdGraphPin* staring = CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Then);staring->PinFriendlyName = FText::FromString("staring");//创建输出引脚02UEdGraphPin* Finished = CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Then);Finished->PinFriendlyName = FText::FromString("finished");
}void UMyNode::ExpandNode(FKismetCompilerContext& CompilerContext, UEdGraph* SourceGraph)
{Super::ExpandNode(CompilerContext, SourceGraph);UEdGraphPin* ExecPin = GetExecPin();UEdGraphPin* ThenPin = GetThenPin();if (ExecPin && ThenPin) {// 调用一个BlueprintFunctionLibrary节点,需要include "UMyBlueprintFunctionLibrary"FName MyFunctionName = GET_FUNCTION_NAME_CHECKED(UMyBlueprintFunctionLibrary, starting);//UK2Node_CallFunction需要include,CompilerContext需要include并且模块内要添加"BlueprintGraph","UnrealEd","GraphEditor","KismetCompiler"UK2Node_CallFunction* CallFuncNode = CompilerContext.SpawnIntermediateNode<UK2Node_CallFunction>(this,SourceGraph);CallFuncNode->FunctionReference.SetExternalMember(MyFunctionName, UMyBlueprintFunctionLibrary::StaticClass());CallFuncNode->AllocateDefaultPins();CompilerContext.MovePinLinksToIntermediate(*ExecPin, *(CallFuncNode->GetExecPin()));FName MyFunctionName01 = GET_FUNCTION_NAME_CHECKED(UMyBlueprintFunctionLibrary, Finished);UK2Node_CallFunction* CallFuncNode01 = CompilerContext.SpawnIntermediateNode<UK2Node_CallFunction>(this,SourceGraph);CallFuncNode01->FunctionReference.SetExternalMember(MyFunctionName01, UMyBlueprintFunctionLibrary::StaticClass());CallFuncNode01->AllocateDefaultPins();CompilerContext.MovePinLinksToIntermediate(*ExecPin, *(CallFuncNode01->GetExecPin()));// move pinsCompilerContext.MovePinLinksToIntermediate(*ThenPin, *(CallFuncNode->GetThenPin()));CompilerContext.MovePinLinksToIntermediate(*ThenPin, *(CallFuncNode01->GetThenPin()));}
}

Function

.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"/*** */
UCLASS()
class NEWCOUSTNODE_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{GENERATED_BODY()public:UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))static void starting();UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true"))static  void Finished();
};

.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "MyBlueprintFunctionLibrary.h"void UMyBlueprintFunctionLibrary::starting()
{if (GEngine) {const int32 AlwaysAddKey = -1;GEngine->AddOnScreenDebugMessage(AlwaysAddKey,5.0f,FColor::Purple,TEXT("starting..."));}
}void UMyBlueprintFunctionLibrary::Finished()
{if (GEngine) {const int32 AlwaysAddKey = -1;GEngine->AddOnScreenDebugMessage(AlwaysAddKey,5.0f,FColor::Red,TEXT("finished..."));}
}

 

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

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

相关文章

华为认证HCIA-HCIP-HCIEdatacom题库解析+机构视频+实验

题库包含有2023年最新HCIA-datacom题库、HCIP-datacom题库&#xff0c;HCIE-datacom题库&#xff0c; 云计算HCIA&#xff0c;HCIP题库&#xff0c;云服务HCIA&#xff0c;HCIP题库&#xff0c;华为存储HCIP题库&#xff0c;华为安全HCIP题库 &#xff0c;学习笔记&#xff0c;…

MES管理系统中设备管理功能的原理是什么

制造执行系统MES是一种应用于制造工厂的实际操作系统&#xff0c;它通过实时监控和控制生产流程&#xff0c;为生产过程提供全面的管理和优化。在MES管理系统解决方案中&#xff0c;设备管理功能是非常重要的一部分&#xff0c;它可以实现设备实时监控、故障预警、维护保养等功…

【论文阅读】通过解缠绕表示学习提升领域泛化能力用于主题感知的作文评分

摘要 本文工作聚焦于从领域泛化的视角提升AES模型的泛化能力&#xff0c;在该情况下&#xff0c;目标主题的数据在训练时不能被获得。本文提出了一个主题感知的神经AES模型&#xff08;PANN&#xff09;来抽取用于作文评分的综合的表示&#xff0c;包括主题无关&#xff08;pr…

【打卡】Datawhale暑期实训ML赛事

文章目录 赛题描述任务要求数据集介绍评估指标 赛题分析基于LightGBM模型Baseline详解改进baseline早停法添加特征 赛题描述 赛事地址&#xff1a;科大讯飞锂离子电池生产参数调控及生产温度预测挑战赛 任务要求 初赛任务&#xff1a;初赛提供了电炉17个温区的实际生产数据&…

使用win10专业版自带远程桌面公司内网电脑

在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数据采集和储存的场景&#xff08;如安保监控、自动化流程等等&#xff09;&#xff0c;更是离不…

pytest自动化测试指定执行测试用例

1、在控制台执行 打开cmd,进入项目目录 指定执行某个模块 pytest testcases\Logistics\Platform\CarSource\test_CarSourceList.py 指定执行某个目录及其子目录的所有测试文件 pytest testcases\Logistics\Platform\CarSource 指定执行某个模块的某个类的某个测试用例 pyte…

Java_25_方法引用

方法引用 方法引用&#xff1a; 方法引用是为了进一步简化Lambda表达式的写法。 方法引用的格式&#xff1a;类型或者对象::引用的方法。 关键语法是&#xff1a;“::” 小结&#xff1a;方法引用可以进一步简化Lambda表达式的写法。关键语法是&#xff1a;“::”范例代码&…

音视频入门之音频采集、编码、播放

作者&#xff1a;花海blog 今天我们学习音频的采集、编码、生成文件、转码等操作&#xff0c;我们生成三种格式的文件格式&#xff0c;pcm、wav、aac 三种格式&#xff0c;并且我们用 AudioStack 来播放音频&#xff0c;最后我们播放这个音频。 使用 AudioRecord 实现录音生成…

前端JavaScript面试100问(上)

1、解释一下什么是闭包 ? 闭包&#xff1a;就是能够读取外层函数内部变量的函数。闭包需要满足三个条件&#xff1a; 访问所在作用域&#xff1b;函数嵌套&#xff1b;在所在作用域外被调用 。 优点&#xff1a; 可以重复使用变量&#xff0c;并且不会造成变量污染 。缺点&am…

文件系统总结

《本文件系统默认linux文件系统》 一、文件系统基本概念 文件系统是操作系统中负责存取和管理信息的模块&#xff0c;它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护&#xff0c;并为用户提供一整套方便有效的文件使用和操作方法文件系统是操作系统中管理文…

idea terminal npm指令无效

文章目录 一、修改setting二、修改启动方式 一、修改setting 菜单栏&#xff1a;File->Settings 二、修改启动方式 快捷方式->右键属性->兼容性->勾选管理员身份运行

unittest 数据驱动DDT应用

前言 一般进行接口测试时&#xff0c;每个接口的传参都不止一种情况&#xff0c;一般会考虑正向、逆向等多种组合。所以在测试一个接口时通常会编写多条case&#xff0c;而这些case除了传参不同外&#xff0c;其实并没什么区别。 这个时候就可以利用ddt来管理测试数据&#xf…

WEB APIs day4 (2)

三、M端事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

6.修饰符

文章目录 6.1 在一个静态方法内调用一个非静态成员为什么是非法的?6.2 静态方法和实例方法有何不同 6.1 在一个静态方法内调用一个非静态成员为什么是非法的? 由于静态方法可以不通过对象进行调用&#xff0c;因此在静态方法里&#xff0c;不能调用其他非静态变量&#xff0…

下级平台级联安防视频汇聚融合EasyCVR平台,层级显示不正确是什么原因?

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…

算法练习-LeetCode1071. Greatest Common Divisor of Strings

题目地址&#xff1a;LeetCode - The Worlds Leading Online Programming Learning Platform Description: For two strings s and t, we say "t divides s" if and only if s t ... t (i.e., t is concatenated with itself one or more times). Given two strin…

Ubuntu 交叉编译openssl + pahomqtt

&#xff08;一&#xff09;交叉编译openssl 1 下载openssl 下载链接&#xff1a;/source/index.html 2 解压openssl tar -xzvf openssl-3.0.9.tar.gz 3 配置其config编译条件 ~/Downloads/openssl-3.0.9$ ./config no-asm -shared --prefix/home/cidi/Downloads/openss…

【华为OD机试】模拟消息队列【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 让我们来模拟一个消息队列的运作,有一个发布者和若干消费者, 发布者会在给定的时刻向消息队列发送消息若此时消息队列有消费者订阅, 这个消息会被发送到订阅的消费者中优先级最高(输…

springboot 发送邮件,以及邮件工具类 并且解决spring-boot-starter-mail 发送邮件附件乱码或者文件错乱

1、设置系统值 System.setProperty(“mail.mime.splitlongparameters”, “false”); 2、 在创建对象的时候定义编码格式(utf-8)&#xff1a; MimeMessageHelper helper new MimeMessageHelper(mes, true, “utf-8”); 3、 其次&#xff0c;在添加附件的时候&#xff0c;附…

安全基础 --- html基础标签 + DNS工作原理

html基础标签 &#xff08;1&#xff09;id id属性是元素在网页内的唯一标识符。 比如&#xff0c;网页可能包含多个<p>标签&#xff0c;id属性可以指定每个<p>标签的唯一标识符。 <p id"p1"></p> <p id"p2"></p>…