当前位置: 首页 > news >正文

虚幻学习笔记10—C++函数与蓝图的通信

一、前言

        除了上一章C++变量与蓝图通信讲的变量能与蓝图通信外,还有函数和枚举也可以和蓝图通信。函数的关键字为”UFUNCTION“、枚举的关键字为”UENUM“。

二、实现

2.1、BlueprintCallable蓝图中调用

  该函数时带执行的,带入如下。编译成功后在蓝图中输入后可以找到,并点击使用如图2.1.1所示

	/// <summary>/// 暴露该函数可在蓝图中调用/// </summary>UFUNCTION(BlueprintCallable, Category = "MyFunction")void BlueprintCallable1();
图2.1.1

2.2、BlueprintPure蓝图中的纯函数

        代码如下,其在蓝图中的形式如图2.2.1所示,它是一个纯函数和图2.1.1不同的是它没有左右

	/// <summary>/// 可在蓝图中调用的纯函数的定义/// </summary>UFUNCTION(BlueprintPure, Category = "MyFunction")bool BlueprintPure2();
图2.2.1

两边的执行引脚。

2.3、BlueprintImplementableEvent

        在C++中声明蓝图中实现,在蓝图中可重载,可以有参数和返回值,无返回值的是事件,有返回值的是函数。

1、没有返回值和参数

        定义的代码如下所示,

	UFUNCTION(BlueprintImplementableEvent)void ImplementableEvent1();

然后在蓝图中它会作为事件添加到蓝图中使用,如图2.3.1所示:

图2.3.1

该事件可以在C++代码中调用

void AMyPawn1::BeginPlay()
{Super::BeginPlay();ImplementableEvent1();
}

2、只有返回值

只有返回值的在蓝图中会作为函数,如图2.3.2所示,同时这个函数可以在蓝图中被重写

	UFUNCTION(BlueprintImplementableEvent)int32 ImplementableEvent2();
图2.3.2

但是在蓝图还无法调用它,需要添加”Blueprint Callable“关键字,如下代码,注意两个关键字的顺

图2.3.3
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)int32 ImplementableEvent2();

序,如果把Blueprint Callable“关键字放在后面编译不通过。增加关键字后的蓝图中可以调用,如图2.3.4所示:

图2.3.4

3、只有参数

代码如下所示,添加一个带参数的,这个效果和图2.3.1中的类似,不同之处是这里会带参数,如图2.3.4所示:

	UFUNCTION(BlueprintImplementableEvent)void ImplementableEvent3(const FString& myStr);
图2.3.4

4、参数和返回值都有

代码如下所示,其效果和图2.3.2所示类似,区别之处在于此处是带输入参数的。

	UFUNCTION(BlueprintImplementableEvent)int32 ImplementableEvent4(const FString& myStr);

2.4、BlueprintNativeEvent

        在C++中声明和实现,蓝图可重载,函数实现的后面要加Implementation,否则会编译出错,但是在调用的时候还是用声明时的名字。无返回值的是事件,有返回值的是函数。代码如下

	UFUNCTION(BlueprintNativeEvent)void BlueprintNativeEvent1();UFUNCTION(BlueprintNativeEvent)int32 BlueprintNativeEvent2();UFUNCTION(BlueprintNativeEvent)void BlueprintNativeEvent3(const FString& myStr);UFUNCTION(BlueprintNativeEvent)int32 BlueprintNativeEvent4(const FString& myStr);

实现的代码如下,又返回值的必须返回一个值。

void AMyPawn1::BlueprintNativeEvent1_Implementation()
{GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("这是一个C++代码写的BlueprintNativeEvent事件"));
}int32 AMyPawn1::BlueprintNativeEvent2_Implementation()
{return 0;
}void AMyPawn1::BlueprintNativeEvent3_Implementation(const FString& myStr)
{}int32 AMyPawn1::BlueprintNativeEvent4_Implementation(const FString& myStr)
{return 0;
}

2.5、Meta元素说明符

该函数定义如下,而且必须实现,通过meta关键字实现其在蓝图中的名称改为“MyPrintTest”

	//元数据说明符,也即别名,在蓝图中会显示DisplayName定义的名字UFUNCTION(BlueprintCallable, Category = "MyFunction", meta = (DisplayName = "MyPrintTest"))void PrintMeta();

2.6、枚举

首先定义一个宏,代码如下,生成枚举的反射数据,通过反射将枚举暴露给蓝图,实现C++和蓝图的通信,BlueprintType的作用是可以在蓝图创建变量的时候也可以作为选项。如图2.6.1所示

UENUM(BlueprintType)//生成枚举的反射数据,通过反射将枚举暴露给蓝图,实现C++和蓝图的通信,BlueprintType的作用是可以在蓝图创建变量的时候也可以作为选项
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};
}
图2.6.1

在蓝图中创建一个新的变量,变量的类型中可以选中C++代码中创建的这个枚举。同时,在蓝图中也可以调用该枚举,如图2.6.2所示:

图2.6.2
通过以下代码可以实现在各类面板和蓝图中使用该变量
	//枚举UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyEnum")TEnumAsByte<MyEnumType::MyCustomEnum> MyCustomEnum;

同时也可以在蓝图中调用和编辑该变量,如图2.6.3所示

图2.6.3

通常一个定义里只能有一个枚举,如下代码中会编译不通过,在MyEnumType中只能定义一个。

UENUM(BlueprintType)
namespace MyEnumType
{enum MyCustomEnum{Type1,Type2,Type3,};enum MyEnum2{One, Two, Three,};
}

三、总结

3.1、BlueprintImplementableEvent的函数在C++代码中只需要声明不需要实现。

3.2、BlueprintNativeEvent的函数在C++代码中声明了还必须实现,不实现会编译报错。实现中的函数名称后总有加上”_Implementation“,但是在调用的时候又要去掉”_Implementation“,这样才能在蓝图中被调用,使用带后缀”_Implementation“的只会在C++中调用,而蓝图中不会被调用。

3.3、”Blueprint Callable“关键字通常是放在前面的,如果放在后面可能会编译不通过。

3.4、BlueprintType的作用是可以在蓝图创建变量的时候也可以作为选项。

3.5、枚举的定义中只能定义一个枚举,多个会编译不通过。

相关文章:

  • C++STL的vector模拟实现
  • 现代皮质沙发模型材质编辑
  • React中父子之间数据的通信方式
  • 托盘四向穿梭车自动化密集库供应|单机智能向系统智能跨越的HEGERLS托盘四向车系统
  • c# bitmap压缩导致png不透明的问题解决
  • 关于mars3d通过zIndex参数实现控制图层层级叠加效果说明
  • 【go-zero】go-zero使用ent框架 如何使用源生sql完成查询
  • YOLOv8算法改进【NO.86】将主干特征网络替换为2023年顶会CVPR的EfficientViT,助力SCI论文发表
  • Kotlin关键字二——constructor和init
  • 算法通关村第十三关—数学与数学基础问题(青铜)
  • ekho环境Linux通过Docker安装
  • AI 训练框架:Pytorch TensorFLow MXNet Caffe ONNX PaddlePaddle
  • 最大公约数gcd的通俗理解和Java代码的实现
  • 多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测
  • Redis(三):常见数据类型:List、Set、Zset
  • Android 控件背景颜色处理
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • avalon2.2的VM生成过程
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTML5新特性总结
  • in typeof instanceof ===这些运算符有什么作用
  • Java的Interrupt与线程中断
  • Java多线程(4):使用线程池执行定时任务
  • Linux各目录及每个目录的详细介绍
  • 基于axios的vue插件,让http请求更简单
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端_面试
  • 日剧·日综资源集合(建议收藏)
  • ​queue --- 一个同步的队列类​
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (4)Elastix图像配准:3D图像
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六)Hibernate的二级缓存
  • (转)Linq学习笔记
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)setTimeout 和 setInterval 的区别
  • (转)程序员疫苗:代码注入
  • (转)详解PHP处理密码的几种方式
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net 8.0 新的变化
  • .net core 控制台应用程序读取配置文件app.config
  • .Net mvc总结
  • .NET 发展历程
  • .NET 指南:抽象化实现的基类
  • .NET/C# 使用反射注册事件
  • .net的socket示例
  • .NET开发者必备的11款免费工具
  • .net中调用windows performance记录性能信息
  • /etc/sudoers (root权限管理)
  • :“Failed to access IIS metabase”解决方法