阿赵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了。
在这里插入图片描述

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

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

相关文章

【神经网络】图像的数字视角

文章目录 图像的数字视角引言直观感受内在剖析图像常用函数图像三维层次 经验总结 图像的数字视角 引言 在机器视觉和目标识别领域&#xff0c;需要处理的对象都是图像&#xff0c;但这些领域的模型都是针对数值进行训练的&#xff0c;那么图像和数值之间是什么关系呢?答案是…

随机产生一些江河上的坐标数据

不久前收到一个需求&#xff0c;说要随机创建约一百个某段江河上的坐标点&#xff0c;用于做一些数据呈现。 我首先是想到用AI直接给我一点数据&#xff0c;没想到给出来的坐标&#xff0c;有许多都落在陆地上&#xff0c;根本不符合我的要求。后来结合AI给出的建议&#xff0…

基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

第一步&#xff1a;准备数据 12种宠物猫类数据&#xff1a;self.class_indict ["阿比西尼猫", "豹猫", "伯曼猫", "孟买猫", "英国短毛猫", "埃及猫", "缅因猫", "波斯猫", "布偶猫&q…

jupyter使用的一个奇怪bug——SyntaxError: invalid non-printable character U+00A0

bug来由&#xff1a;从其他部分例如kaggle里复制来的代码直接粘贴在jupyter notebook里&#xff0c;每一行代码都会出现&#xff1a; Cell In[5], line 1 warnings.filterwarnings(ignore) ^ SyntaxError: invalid non-printable character U00A0 单元格 In[5]&#xff0c;第 …

多模态AI的挑战与早期壁垒的构建

伴随着Sora、GPT40的推出&#xff0c;多模态AI逐渐成为研究的热点和应用的趋势。然而&#xff0c;多模态AI的发展并非一帆风顺&#xff0c;它面临着诸多挑战和壁垒。 一、多模态AI的难点 多模态AI的核心在于将不同模态的信息&#xff08;如文本、图像、音频、视频等&#xff…

AI大佬都在说下一个爆点是智能体,建议开发者抢占先机!

现在大模型行至一年&#xff0c;风口与炒作如影随形&#xff0c;相信很多人身处其中但仍然感到很迷失&#xff0c;这个行业到底发展到什么程度了&#xff0c;作为普通开发者还有什么可以抓住的机会&#xff1f;从AI大佬的观点中&#xff0c;我们能获得一些行业变化的新风向。 …

ssh-add id_rsa_gitlab1 Error connecting to agent: No such file or directory

ssh-add id_rsa_gitlab1 Error connecting to agent: No such file or directory 目录 ssh-add id_rsa_gitlab1 Error connecting to agent: No such file or directory1. 启动 SSH 代理2. 添加 SSH 密钥3. 使用 Git Bash 或其他终端4. 使用 Pageant&#xff08;适用于 PuTTY 用…

Eigen中 Row-Major 和 Column-Major 存储顺序的区别

Eigen中 Row-Major 和 Column-Major 存储顺序的区别 flyfish Eigen::RowMajor 是 Eigen 库中用于指定矩阵存储顺序的一种选项 理解 Row-Major 和 Column-Major 存储顺序的区别&#xff0c;绘制一个单一的图来显示内存中的元素访问顺序,在图中用箭头表示访问顺序. import nu…

从实例出发,深入探索Java SE中数组的易错点

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

神经网络模型---AlexNet

一、AlexNet 1.导入tensorflow库&#xff0c;这里给简称为tf库 import tensorflow as tf from tensorflow.keras import datasets, layers, modelsdatasets&#xff1a;是用于训练和测试机器学习模型的数据集合 layers&#xff1a;是构建神经网络模型的关键组成部分 models&a…

豆包高质量声音有望复现-Seed-TTS

我们介绍了 Seed-TTS&#xff0c;这是一个大规模自回归文本转语音 &#xff08;TTS&#xff09; 模型系列&#xff0c;能够生成与人类语音几乎没有区别的语音。Seed-TTS 作为语音生成的基础模型&#xff0c;在语音上下文学习方面表现出色&#xff0c;在说话人的相似性和自然性方…

摄像头图像矫正的表格生成方法

1.设置单元格高宽 点击表格左上角 的 小三角 列宽: HOME -> Rows and Columns -> Column Width 5 CM 行高: HOME -> Rows and Columns -> Row Height 5 CM 2.设置 条件格式 HOME -> Conditional Formatting-> Manager Rules 点击 左上方 New Rule…

win11右键小工具

开头要说的 在日常使用场景中&#xff0c;大家如果用的是新的笔记本电脑&#xff0c;应该都是安装的win11系统&#xff0c; 当然win11系统是最被诟病的&#xff0c; 因为有很多人觉得很难操作&#xff0c; 就比如一个小小的解压操作&#xff0c; 在win7和win10上&#xff…

gitlab 身份验证手机号验证没86

处理方案 在浏览器中摁 【F12】打开控制台&#xff0c;选择网络模块&#xff0c;找到手机号列表的请求&#xff0c;请求是 https://gitlab.com/-/countries&#xff0c;右击数据区域点击【替换内容】如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/di…

gRPC(Google Remote Procedure Call Protocol)谷歌远程过程调用协议

文章目录 1、gRPC简介2、gRPC核心的设计思路3、gPRC与protobuf关系 1、gRPC简介 gPRC是由google开源的一个高性能的RPC框架。Stubby Google内部的RPC&#xff0c;演化而来的&#xff0c;2015年正式开源。云原生时代是一个RPC标准。 2、gRPC核心的设计思路 网络通信 ---> gPR…

API-声明变量const优先

学习目标&#xff1a; 掌握声明变量const优先 学习内容&#xff1a; 变量声明总结 变量声明&#xff1a; 变量声明有三个var let const。 首先var排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 建议&#xff1a;const优先&#xff0c;尽量使用cons…

amr文件怎么转换成mp3?超好用的四种转换方法介绍!

amr文件怎么转换成mp3&#xff1f;在当今数字化时代&#xff0c;音频格式的多样性给我们带来了更广泛的选择&#xff0c;其中AMR格式就是其中之一&#xff0c;AMR格式在录音和通话领域得到广泛应用&#xff0c;但与此同时&#xff0c;它也存在一些挑战和局限性&#xff0c;尽管…

推荐常用的三款源代码防泄密软件

三款源代码防泄密软件——安秉源代码加密、Virbox Protector 和 MapoLicensor——确实各自在源代码保护的不同方面有其专长。这些软件可以满足企业对于源代码保护的三大需求&#xff1a;防止泄露、防止反编译和防止破解。 安秉源代码加密&#xff1a; 专注于源代码文件的加密&…

安卓Context上下文

目录 前言一、Context简介二、Application Context2.1 Application Context的创建过程2.2 Application Context的获取过程 三、Activity的Context创建过程四、Service的Context创建过程 前言 Context也就是上下文对象&#xff0c;是Android较为常用的类&#xff0c;但是对于Co…

C++ 70 之 类模版中的成员函数,在类外实现

#include <iostream> #include <string> using namespace std;template<class T1, class T2> class Students10{ public:T1 m_name;T2 m_age;Students10(T1 name, T2 age); // 类内声明 类外实现// {// this->m_name name;// this->m_age …