UE5 自定义蓝图节点(记录,备忘)

这篇具有很好参考价值的文章主要介绍了UE5 自定义蓝图节点(记录,备忘)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创建一个工程项目,创建一个K2Node类(生成节点),创建一个蓝图函数库(实现节点内功能)

项目.Build.cs内添加模块

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class NewCoustNode : ModuleRules
{
	public NewCoustNode(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] { "BlueprintGraph","UnrealEd","GraphEditor","KismetCompiler" });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

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

K2Node.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需要include
	if (ActionRegistrar.IsOpenForRegistration(ActionKey))
	{
		//UBlueprintNodeSpawner需要include
		UBlueprintNodeSpawner* 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);

	//创建输出引脚01
	UEdGraphPin* staring = CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, UEdGraphSchema_K2::PN_Then);
	staring->PinFriendlyName = FText::FromString("staring");

	//创建输出引脚02
	UEdGraphPin* 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 pins
		CompilerContext.MovePinLinksToIntermediate(*ThenPin, *(CallFuncNode->GetThenPin()));
		CompilerContext.MovePinLinksToIntermediate(*ThenPin, *(CallFuncNode01->GetThenPin()));
	}
}

BlueprintFunctionLibrary.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();
};

BlueprintFunctionLibrary.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...")
		);
	}
}

这是简单定制蓝图节点的实现过程文章来源地址https://www.toymoban.com/news/detail-604193.html

到了这里,关于UE5 自定义蓝图节点(记录,备忘)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE5 蓝图编辑美化学习

    虚幻引擎中干净整洁蓝图的15个提示_哔哩哔哩_bilibili         好用,爱用         好用,爱用         好用,能避免一些的拼写错误         两点一水平线         (以前不懂,现在经常用)         好用,爱用         .         .         好用,爱用        

    2024年01月20日
    浏览(32)
  • 关于UE5角色动画蓝图的基本操作(基础向)

    1、在做角色蓝图动画前,首先需要有一个可操控的角色。操作方法如下:         新建Player文件夹-在其中创建关于世界设置的蓝图:GameModeBase、PlayerController、以及角色所需要的Character(在这里因为是以第三人称为基础所以创建此蓝图类)为了区分与系统的区别可以在命名前

    2024年02月11日
    浏览(79)
  • UE5回合制游戏【2-摄像机控制】(蓝图版)

    上一篇文章完成了一些基础的设置,这篇文章主要来设置一下摄像机。 摄像机的控制主要有鼠标滚轮控制缩放,WASD键控制前后左右移动,QE键控制左右旋转。 首先打开BP_Pawn,然后添加Spring和Camera组件。 层级关系如下图 我们把摄像机放到弹簧臂下面,这样摄像机就能跟着弹

    2024年02月03日
    浏览(39)
  • 【保姆级从0到1】UE5 蓝图入门教程1:关卡、蓝图入门

    20230113 新建选择 UE 5.1 项目 选择蓝图,项目位置 改变编辑器布局,选择经典布局 选择 File - New Level 准备创建关卡 选择 Basic,点击 Create 进行创建 Ctrl + S 保存新建的关卡 关卡蓝图的打开 鼠标右键,添加蓝图事件,这里先删除默认的所有蓝图,然后鼠标右键,选择 事件开始运

    2023年04月08日
    浏览(32)
  • UE5学习笔记(十四)——蓝图基础之第一次做界面

    目录 制作一个简单的UI 步骤1:添加一个界面,并显示在屏幕上 【知识点】在关卡界面调用控件的值 步骤2:蓝图控制文字改变

    2024年02月04日
    浏览(38)
  • 【虚幻引擎UE】UE4/UE5 基于2D屏幕坐标获取场景3D坐标 射线检测(蓝图/C++)

    射线检测(Ray Casting) 是一种计算机图形和计算机图形学中的基本技术,用于检测光线或射线是否与三维场景中的物体相交,以确定相交点的位置和其他相关信息。射线检测通常用于实现各种交互功能、渲染效果和物理模拟,包括但不限于鼠标拾取、光线追踪、碰撞检测和物

    2024年02月07日
    浏览(71)
  • 【UE5/UE4】【UE C++】制作一个蓝图宏库用以在构造器中Spawn Actor

    实际上该功能可以通过纯蓝图写出,以下展示蓝图中如何操作构造器 仅需在创建\\\"自定义事件\\\"的时候勾选\\\"编辑器中调用\\\"属性,然后就可以直接在蓝图中生成 但同时,我们发现\\\"从类生成Actor\\\"该蓝图节点具有生成局限性 无法在当前关卡外生成 以及无法生成某些在蓝图中公开却不在

    2024年02月14日
    浏览(45)
  • UE4,UE5虚幻引擎,怎么在蓝图中获取FPS帧速率,显示在UMG(UI)上

    前言:在UE中可以使用命令行比如stat fps显示帧率,但只是显示在界面,假设我们要在蓝图中获取FPS帧率,并且显示在我们创建的UMG控件蓝图。这种stat fps命令行的形式就不行了,因为它只会固定显示在右上角的位置。 1、在Tick中获取DeltaSeconds,用1除InDeltaTime,得到帧速率。

    2024年02月11日
    浏览(36)
  • 【UE5】蓝图UI控件菜单锚(Menu Anchor)的使用与浮动详情窗口的制作

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近在做毕设,一直在苦恼要怎么精准地把浮动的详情窗口放在图标的一边,就比如下图中的效果 本来也有想过直接获取控件在屏幕上的位置来计算浮动窗口的生成位置,但神奇的是蓝图似乎没有这个

    2024年02月11日
    浏览(31)
  • UE学习记录03----UE5.2 使用MVVM示例

    1.打开ue5.2新建C++项目 2.项目中通过类导向新建C++类,父类选择为UMVVMViewModelBase,创建完成会自动打开vs   3.在VS中对新建的类进行宏定义 使用  C++ 类向导  创建的类声明自动通过  UCLASS()  宏进行处理。  UCLASS()  宏使得引擎意识到这个类的存在,并且还可以同键盘修饰符结

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包