阿赵UE引擎C++编程学习笔记——C++自定义蓝图函数

  大家好,我是阿赵。
  使用UE引擎,大部分功能都可以使用蓝图的自带节点去完成。但有时候我们也需要扩展一些蓝图没有的功能。这一篇主要学习一下怎样用C++给蓝图新增自定义的函数节点。

一、 新建蓝图函数库

  在添加C++类的时候,选择蓝图函数库:
在这里插入图片描述

  填一个类名,比如我这里命名为AzhaoFunLib
在这里插入图片描述

  会自动生成.h文件和cpp文件。这种函数库,是继承UBlueprintFunctionLibrary的。
接下来将会举一个非常简单的例子,我写一个函数,输入两个浮点参数a和b,然后得到他们相加的结果。所以我声明一个AddNumber函数:
AzhaoFunLib.h

#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AzhaoFunLib.generated.h"/*** */
UCLASS()
class UECPPTEST_API UAzhaoFunLib : public UBlueprintFunctionLibrary
{GENERATED_BODY()static float AddNumber(float a, float b);
};

AzhaoFunLib.cpp

#include "AzhaoFunLib.h"float UAzhaoFunLib::AddNumber(float a, float b)
{return a + b;
}

二、 让蓝图函数显示在节点列表

  函数已经写完了,编译一下,再回到UE的蓝图界面,会发现并不能搜索出我刚才写的函数节点:
在这里插入图片描述

  接下来这一步非常的重要,加上去之后,就会出现奇迹:
在.h文件声明函数的地方,加上UFUNCTION宏,比如

UFUNCTION(BlueprintPure, Category = “Azhao”)
static float AddNumber(float a, float b);

这里用到2个参数
1. BlueprintPure
这里指定了函数在蓝图里面节点的类型
2. Category = “Azhao”
  这里指定了函数的节点所在的分类
  把宏加上后,编译,再回到蓝图界面,会发现可以搜索出自定义的函数了:
在这里插入图片描述

  这时候创建出来的节点,是长这样的:
在这里插入图片描述

  完整的.h文件现在是这样:

#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AzhaoFunLib.generated.h"/*** */
UCLASS()
class UECPPTEST_API UAzhaoFunLib : public UBlueprintFunctionLibrary
{GENERATED_BODY()UFUNCTION(BlueprintPure, Category = "Azhao")static float AddNumber(float a, float b);
};

  可以看到,现在生成的节点是没有三角形调用进度,是一个纯的函数计算节点。
  如果把UFUNCTION宏里面的BlueprintPure改为BlueprintCallable,比如这样:

UFUNCTION(BlueprintCallable, Category = "Azhao")
static float AddNumber(float a, float b);

  那么节点会变成可以有调用进度的类型:
在这里插入图片描述

在这里插入图片描述

  这里可以明显看出BlueprintPure和BlueprintCallable的区别了。

三、 WorldContext 参数的使用

  接下来我要做一个通过路径来加载Actor蓝图的功能节点。
  之前介绍过,在C++里面创建Actor,是这样写的:

UClass* bpVar = LoadClass<AActor>(nullptr, *path);
AActor* spawnActor = GetWorld()->SpawnActor<AActor>(bpVar)

  但这里有一个问题,GetWorld是要继承Actor的类才能直接调用的,但作为纯代码库的蓝图库函数,是没有这个继承关系的,所以GetWorld也是不能直接调用。
  所以这里要引入一个WorldContext 参数,让我们能通过它来调用GetWorld
在.h文件里面声明这个函数:

UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject"), Category = "Azhao")
static AActor* SpawnActorByPath(const UObject* WorldContextObject, FString path);

  注意看UFUNCTION宏里面,多了一个meta = (WorldContext = “WorldContextObject”),然后在输入参数里面,声明了一个const UObject* WorldContextObject。
  这样,在函数实现里面,我们就可以通过

AActor* spawnActor = WorldContextObject->GetWorld()->SpawnActor<AActor>(bpVar);

  来调用GetWorld,并生成出Actor了

  然后完整的代码是这样:

AzhaoFunLib.h

#pragma once#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "AzhaoFunLib.generated.h"/*** */
UCLASS()
class UECPPTEST_API UAzhaoFunLib : public UBlueprintFunctionLibrary
{GENERATED_BODY()UFUNCTION(BlueprintCallable, Category = "Azhao")static float AddNumber(float a, float b);UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject"), Category = "Azhao")static AActor* SpawnActorByPath(const UObject* WorldContextObject, FString path);
};

AzhaoFunLib.cpp

#include "AzhaoFunLib.h"float UAzhaoFunLib::AddNumber(float a, float b)
{return a + b;
}AActor* UAzhaoFunLib::SpawnActorByPath(const UObject* WorldContextObject, FString path)
{UClass* bpVar = LoadClass<AActor>(nullptr, *path);if (bpVar != nullptr){AActor* spawnActor = WorldContextObject->GetWorld()->SpawnActor<AActor>(bpVar);return spawnActor;}else{return nullptr;}}

  编译后回到了蓝图界面,发现自定义函数可以被搜索到了:
在这里插入图片描述

  WorldContextObject参数并不会暴露出来,我们直接调用这个节点,然后填入Path参数,就可以在场景里面生成Actor了。
在这里插入图片描述

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

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

相关文章

指纹浏览器与虚拟机的区别及在跨境电商中的应用

在如今数字化世界中&#xff0c;隐私和安全变得愈发重要。许多人在网络上进行敏感操作&#xff0c;如网上购物、在线银行、社交媒体管理等。为了保护自己的隐私&#xff0c;人们常常会寻求一些额外的工具&#xff0c;比如指纹浏览器和虚拟机。这两种工具在保护个人隐私方面都有…

Thinkphp5内核流浪猫流浪狗宠物领养平台H5源码

Thinkphp5内核流浪猫流浪狗宠物领养平台H5源码 可封装APP&#xff0c;适合做猫狗宠物类的发信息发布&#xff0c;当然懂的修改一下&#xff0c;做其他信息发布也是可以的。 Thinkphp5内核流浪猫流浪狗宠物领养平台H5源码

Linux常用命令(14)—查看文件内容(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

JavaScript 冷知识大赏:带你领略不一样的编程乐趣

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;JavaScript 中的小 tips&#x1f4e7;1 严格模式&#x1f49e;…

ython机器学习分类算法(六)-- 逻辑回归(Logistic Regression)

逻辑回归原理 逻辑回归虽然名为“回归”&#xff0c;但实际上是一种用于处理二分类或多分类问题的分类算法。其核心思想是&#xff0c;利用线性回归模型的预测结果逼近真实标记的对数几率&#xff08;log odds&#xff09;&#xff0c;因此得名“逻辑回归”。具体来说&#xff…

一个简单的UDP客户端和服务端的完整C++示例

下面是一个简单的UDP客户端和服务端的完整C示例。这个示例展示了如何创建一个UDP客户端和服务端&#xff0c;并在它们之间发送和接收消息。 cpp UDP 服务端 cpp // udp_server.cpp #include <iostream> #include <cstring> #include <sys/types.h> #include …

Spring之IoC(容器配置、Spring坐标导入、获取bean)

这里的话&#xff0c;因为博主学习时间有限&#xff0c;并没有实际去操作&#xff0c;只是学习和了解一个大概的流程。 目录 一、引言 1、管理什么&#xff1f;&#xff08;对象&#xff1a;Service、Dao ...&#xff09; 2、如何将被管理的对象告知 IoC 容器?&#xff08;用…

【ARM 安全系列介绍 3.7 -- SM4 对称加密算】

请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | GCC | CSH | Armv8/v9 系统异常分析】 文章目录 SM4 加密算法简介SM4 工作模式算法步骤加密举例注意事项 Principle of SM4 encryption algorithm SM4 加密算法简介 SM4是一种分组…

如何基于Redis实现分布式锁?

分布式锁介绍 对于单机多线程来说&#xff0c;在 Java 中&#xff0c;我们通常使用 ReetrantLock 类、synchronized 关键字这类 JDK 自带的 本地锁 来控制一个 JVM 进程内的多个线程对本地共享资源的访问。 下面是我对本地锁画的一张示意图。 本地锁 从图中可以看出&#xf…

Unity 限时免费资源 - FANTASTIC万圣节资源包

Unity 资源 - FANTASTIC - Halloween Pack 万圣节包 前言资源包内容领取兑换码 前言 亲爱的 Unity 游戏开发者们&#xff0c;今天要给大家介绍一款限时免费的优质资源包 - FANTASTIC - Halloween Pack 万圣节资源包。 这个资源包为您的游戏创作带来了丰富的万圣节主题元素。其…

开关阀(3):Fisher DVC6200定位器原理及调试

Fisher DVC6200---Digital Valve Controllers&#xff08; 数字阀门控制器&#xff09;简写 DVC,而6200是Fisher DVC定位器发展的一个系列型号&#xff0c;是Fisher结合DVC2000、DVC6000系列&#xff0c;取其特点发展的有着高适用性和高可靠性的阀门定位器。 DVC6200 原理&…

线性代数|机器学习-P17矩阵A逆和奇异值的导数

文章目录 1. A 2 A^2 A2关于时间的导数2. 奇异值 σ \sigma σ 关于时间的导数3. 迭代特征值3.1 交替特征值3.2 ST 矩阵最大特征值 4. 瑞利商的思考4.1 瑞利商的定义4.2 性质1 1. A 2 A^2 A2关于时间的导数 我们在已知 d A d t \frac{\mathrm{d}A}{\mathrm{d}t} dtdA​的情…

Apriori 处理ALLElectronics事务数据

通过Apriori算法挖掘以下事务集合的频繁项集&#xff1a; 流程图 代码 # 导入必要的库 from itertools import combinations# 定义Apriori算法函数 def apriori(transactions, min_support, min_confidence):# 遍历数据&#xff0c;统计每个项的支持度 item_support {}for tr…

AI数据分析:根据时间序列数据生成动态条形图

动态条形竞赛图&#xff08;Bar Chart Race&#xff09;是一种通过动画展示分类数据随时间变化的可视化工具。它通过动态条形图的形式&#xff0c;展示不同类别在不同时间点的数据排名和变化情况。这种图表非常适合用来展示时间序列数据的变化&#xff0c;能够直观地显示数据随…

移动端vue+vant4选择日期+时间,返回结果是:2024-07-23 10:27格式

环境&#xff1a;vue3、 vant4、vite <van-popup v-model:show"showPicker" round position"bottom"><van-picker-grouptitle"预约日期":tabs"[选择日期, 选择时间]"next-step-text"下一步"confirm"onConfir…

亚马逊卖家注册业务类型怎么选?VC账号能申请?

在亚马逊卖家注册时&#xff0c;业务类型的选择是非常重要的&#xff0c;因为它将直接影响您的销售策略、费用结构以及您在平台上的权限。目前&#xff0c;亚马逊主要的卖家业务类型包括专业卖家和个人卖家&#xff0c;而VC&#xff08;Vendor Central&#xff09;账号和VE&…

Camtasia2024中文版最新电脑录屏剪辑神器!

大家好&#xff0c;今天我要安利一个我最近超级喜欢的工具——Camtasia2024中文版&#xff01;这款软件真的太棒了&#xff0c;它让我的视频编辑工作变得更加轻松和高效。如果你也对视频制作感兴趣&#xff0c;那么一定要尝试一下这款神器哦&#xff01; Camtasia2024win-正式…

那在中国,版权保护方面还有哪些缺陷?能否运用区块链技术解决?

目录 一、主要缺陷 1. 版权确权困难 2. 侵权行为难以追踪 3. 维权难度大 4. 中介机构效率低下 5. 盗版问题严重 二、 区块链技术的具体应用 1. 版权确权与存证 2. 智能合约 3. 作品追踪与溯源 4. 分布式存储 5. 数字身份认证 三、 结论 中国在版权保护方面虽然已经…

动态规划02(Leetcode62、63、343、96)

参考资料&#xff1a; https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移…

VBA:demo大全

VBA常用小代码合集&#xff0c;总有一个是您用得上的~ (qq.com) 如何在各个分表创建返回总表的命令按钮&#xff1f; 今天再来给大家聊一下如何使用VBA代码&#xff0c;只需一键&#xff0c;即可在各个分表生成返回总表的按钮。 示例代码如下&#xff1a; Sub Mybutton()Dim …