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

news2024/11/25 0:36:59

  大家好,我是阿赵。
  使用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.coloradmin.cn/o/1834276.html

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

相关文章

大数据的力量:推动战略决策和业务转型

在当前全球化的时代背景下&#xff0c;国际间的联系日益紧密&#xff0c;世界变得更加互联互通。面对各种危机&#xff0c;数据驱动决策和分析显得愈发重要。从医学研究到市场趋势分析&#xff0c;大数据技术在各个领域发挥着关键作用&#xff0c;推动着一场深刻的变革浪潮。 大…

初识数据库及Mysql安装管理

初识数据库及Mysql安装管理 了解数据库数据库的概念数据库的分类关系型数据库&#xff08;SQL&#xff09;非关系型的数据库&#xff08;NoSQL&#xff09; SQL语句SQL语言分类&#xff1a; MySQL中6种常见的约束&#xff1a; Mysql安装&#xff08;CentOS7&#xff09;源码编译…

mybatis中resultMap和resultType的区别

总结 基本映射 &#xff1a;&#xff08;resultType&#xff09;使用resultType进行输出映射&#xff0c;只有查询出来的列名和pojo中的属性名一致&#xff0c;该列才可以映射成功。&#xff08;数据库&#xff0c;实体&#xff0c;查询字段,这些全部都得一一对应&#xff09;…

gridview自带编辑功能如何判断用户修改的值的合法性

在使用GridView的编辑功能更新值时&#xff0c;确保输入的值合法性是十分重要的。为了实现这一点&#xff0c;你可以在GridView的RowUpdating事件中加入代码来检查用户输入的值。如果发现输入的值不合法&#xff0c;你可以取消更新操作并向用户显示错误消息。下面是如何实现的步…

ESP8266-01S烧录MQTT固件ERROR问题

今天在烧录ESP8266固件时遇到了这个问题&#xff0c;技术客服给了个有效的解决方案。 选择固件的时候可以先确认自己的模块是ESP8266或者EPS8285主控&#xff0c;这在选择DOWNLOADTOOL时还不一样。 然后波特率是115200&#xff0c;我在这个地方选错成1152000。 当然上面都不…

Proxy和definedProperty

1. Proxy 代理 定义: 用于定义基本操作的自定义行为 Proxy修改的是程序默认形为&#xff0c;就形同于在编程语言层面上做修改&#xff0c;属于元编程 元编程 是指某类计算机程序的编写&#xff0c;这类计算机程序编写或者操纵其它程序&#xff08;或者自身&#xff09;作为它…

Python 引入中文py文件

目录 背景 思路 importlib介绍 使用方法 1.导入内置库 importlib.util 2.创建模块规格对象 spec importlib.util.spec_from_file_location("example_module", "example.py") 3.创建模块对象 module importlib.util.module_from_spec(spec) …

全国产城市轨道交通运营公安AI高清视频监控系统

方案简介 城市轨道交通运营公安高清视频监控系统解决方案针对运营部门和公安部门的安保需求&#xff0c;选用华维视讯的各类前端和视频编解码、控制产品&#xff0c;通过统一平台提供视频监控服务和智能应用&#xff0c;满足轨道交通运营业主客运组织和抢险指挥的需求&#xff…

electron自定义标题栏的最大化,最小化,关闭窗口

渲染组件代码&#xff1a; <template><div class"window-btn"><i class"minimize" click"minimize"><img src"../assets/img/最小化.svg" alt"最小化" /></i><i v-if"!isMaximized&…

【YOLO模型训练时,减小批次大小(Batch Size)可能会加快训练速度】

文章目录 1.在使用YOLOv8进行目标检测模型训练时&#xff0c;减小批次大小&#xff08;Batch Size&#xff09;可能会加快训练速度。2. 这种现象主要与以下几个因素有关&#xff1a;1.显存限制&#xff08;GPU Memory Constraints&#xff09;&#xff1a;2.梯度累积&#xff0…

项目学习---Javaweb(超市订单管理系统)

知识点 MVC模型: 实现步骤:分为3级 1.M(Model) 持久层 代码与数据库进行交互的代码(Mybatis-dao层) 2.C(Control) 控制层 完成某项业务的具体操作过程(Controller层----Service层) 3.V(View) 视图层 一般指用户看到的内容(页面) 项目目录 .filter //过滤器 解决中文字符集…

C#——文件读取FileStream类详情

文件读取FileStream类 一个文件进行读写的时候&#xff0c;会变成一个文件流 FileStream类输入流 用于从文件进行读取文件。输出流&#xff0c;向文件写入的操作 FilleStream用于文件当中任何位置的读写 此文章借鉴与&#xff1a;C#教程&#xff08;非常详细&#xff09; Fil…

Geek新鲜事15: Linus Torvalds 发话了,新调度器sched_ext将合入Linux6.11

“ext”对应的英文单词为“extensible”&#xff0c;意为可扩展的。开发者Tejun Heo通过整整30 个的patchs&#xff0c;提供了一个支持eBPF程序修改调度策略的调度类。其核心目的有三个&#xff1a; 让开发者更易于实验和探索新的调度策略&#xff0c;免去编译完整内核镜像的成…

mediasoup源码分析(三)channel创建及信令交互

mediasoup源码分析--channel创建及信令交互 概述跨职能图业务流程图代码剖析 概述 在golang实现mediasoup的tcp服务及channel通道一文中&#xff0c;已经介绍过信令服务中tcp和channel的创建&#xff0c;本文主要讲解c中mediasoup的channel创建&#xff0c;以及信令服务和medi…

【吉林大学Java程序设计】第11章:网络编程技术

第11章&#xff1a;网络编程技术 1.网络协议概述2.网络类及应用&#xff08;1&#xff09;InetAddress类&#xff08;2&#xff09;ServerSocket类&#xff08;3&#xff09;Socket类基于TCP的点对点通信基于TCP的点对面通信&#xff08;一个服务器&#xff0c;多个客户端&…

css之sprite

css之sprite 图片整合 sprite 优势 整合的方法 ps 新建图层&#xff08;名字为英文、给定宽高、选择像素、背景内容设置透明、创建&#xff09;ctrlc复制小图 ctrlv 粘贴 选择工具移动位置裁剪工具&#xff0c;剪掉下方多余的位置 enter导出&#xff08;PNG&#xff09; 精灵…

2024年最好用的精简系统推荐!旧电脑福音!

精简版电脑系统经过精心优化&#xff0c;去除了冗余功能&#xff0c;保留了核心功能&#xff0c;让用户的操作更加便捷高效&#xff0c;同时也具备强大的兼容性和稳定性&#xff0c;整体操作体验感很好。但是&#xff0c;许多新手用户不知道在哪里才可以找到好用的精简版系统&a…

四步搞定!图文详解qq音乐转mp3

随着数字音乐的普及&#xff0c;许多人选择使用QQ音乐来欣赏自己喜爱的歌曲和专辑。然而&#xff0c;有时我们可能希望将QQ音乐中的音频转换为MP3格式&#xff0c;以便更灵活地在各种设备上播放或分享。虽然QQ音乐并没有直接提供MP3下载选项&#xff0c;但通过一些巧妙的方法&a…

对 PLC AC 模块的 TRIAC 输出进行故障排除

在大多数离散 PLC 系统中&#xff0c;排除输出设备故障的过程相当简单。如果输出端正常工作&#xff0c;则在“关闭”时应测量 0 V&#xff0c;在“开启”时应测量满源电压。对于数字和继电器输出&#xff0c;情况确实如此。对于由 TRIAC 驱动的 AC 输出也应如此&#xff0c;但…

streamlit markdown里支持latex公式显示

参考&#xff1a; https://docs.streamlit.io/develop/api-reference/write-magic/st.write https://discuss.streamlit.io/t/streamlit-markdown-a-streaming-markdown-component-with-latex-mermaid-table-code-support/72187 也有独立支持的st.latex 接口单独显示公司&…