使用虚幻引擎中的C++导论(三-反射系统与迭代器)
使用虚幻引擎中的C++导论(三)
第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢。
第二,某些细节操作,这篇文章省略了,如果有不懂的,去看其他教程。
第三,没有C++编程经验,但有其他OOP语言经验的朋友。要先了解C++的基础。
继续深入研究
好了,很显然你想要知道更多。让我们更深入的了解虚幻引擎是怎么工作的。
虚幻反射系统
Blog Post: Unreal Property System (Reflection)
游戏类使用特殊的标记,在我们继续讲解之前,让我们了解一些虚幻属性系统的基础知识。虚幻4引擎使用其自身的反射机制实现动态特性,诸如,垃圾回收机制,序列化,网络复制,蓝图/C++通信。这些特性是可选的,意味着你可以正确的把这些功能组合进你的类型,否则虚幻会忽略它们,而不是对他们产生反射数据。下面是基础标记的大致概括。
- UCLASS() - 让虚幻为类生产反射数据,这个类必须继承UObject。
- USTRUCT() - 让虚幻为结构体生产反射数据。
- GENERATED_BODY() - 为该类生产必要的样本代码
- UPROPERTY() - 通过UPROPERTY标记,让UCLASS 类或者USTRUCT 结构体的成员变量可用。UPROPERTY 标记有很多种用法。它允许变量可以复制、序列化、被蓝图访问。它同样被用于垃圾回收机制,去回收UCLASS 类。
- UFUNCTION() - 通过UPROPERTY标记,让UCLASS 类或者USTRUCT 结构体的成员变量可用。UFUNCTION 标记可以让方法被蓝图访问调用,并作为远程过程调用协议(RPC)的类方法,等等。
下面是个使用UCLASS标签的例子:
#include "MyObject.generated.h"
UCLASS(Blueprintable)
class UMyObject : public UObject
{
GENERATED_BODY()
public:
MyUObject();
UPROPERTY(BlueprintReadOnly, EditAnywhere)
float ExampleProperty;
UFUNCTION(BlueprintCallable)
void ExampleFunction();
};
若文件包含“MyClass.generated.h”。虚幻引擎会生产反射信息并且注入这个文件。在你的文件类型中,必须包含这个头文件。
你还可以注意到,我们同样加了特定的标志。我已经添加了一些较为常见的示范。这允许我们指定我们类型有的某种行为。
- Blueprintable - 类可以被蓝图扩展。
- BlueprintReadOnly - 属性只能被蓝图读取,不能修改。
- Category - 定义虚幻编辑器中细节面板上属性所在的分类。用于组织属性需要。
- BlueprintCallable - 方法可被蓝图调用。
有太多特定的标志,下面的链接可以看到这些标志的详细内容。
对象/Actor 迭代器
对于迭代UObject 类型和其子类的所有实例,对象迭代器 是非常有用的工具。
// Will find ALL current UObjects instances
for (TObjectIterator<UObject> It; It; ++It)
{
UObject* CurrentObject = *It;
UE_LOG(LogTemp, Log, TEXT("Found UObject named: %s"), *CurrentObject.GetName());
}
你可以限定查找的范围通过为迭代器提供更多特定类型,假设你有一个类叫UMyClass,它继承UObject,你可以像下面的代码一样查询到所有实例:
for (TObjectIterator<UMyClass> It; It; ++It)
{
// ...
}
警告:在PIE(Play In Editor,即在编辑器中点击“Play”按钮)中使用迭代器会发生意外的结果。在编辑器装载时,对象迭代器将为你的世界实例,返回所有已经生成的UObjects 对象,除了那些只是正在使用的编辑器(材质,animation等编辑器?)。
Actor迭代器与对象迭代器有很多共同点,但是它仅支持继承AActor的对象。Actor迭代器没有下文所述的问题,并且将只能返回近期的游戏世界实例对象。
当生成一个Actor迭代器时,你需要一个指针指向世界实例UWorld,很多UObject 类,比如,APlayerController类支持GetWorld()方法来帮助开发者。如果你不确定这个类是否实现了GetWorld()方法 ,你可以在一个UObject 类中使用ImplementsGetWorld() 方法检查。
APlayerController* MyPC = GetMyPlayerControllerFromSomewhere();
UWorld* World = MyPC->GetWorld();
// Like object iterators, you can provide a specific class to get only objects that are
// or derive from that class
for (TActorIterator<AEnemy> It(World); It; ++It)
{
// ...
}
(由于AActor 继承UObject,你可以用TObjectIterator 在很多AActor中查找实例,只是需要小心PIE)
使用虚幻引擎中的C++导论(三-反射系统与迭代器)的更多相关文章
- 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)
使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...
- 使用虚幻引擎中的C++导论(二-UE4基类)
使用虚幻引擎中的C++导论(二) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...
- 使用虚幻引擎中的C++导论(一-生成C++类)
使用虚幻引擎中的C++导论(一) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...
- 虚幻引擎中的数组---TArray: Arrays
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45367171 作者:ca ...
- [原][unreal][UE][spark]分析unreal engine 虚幻引擎的粒子编辑器:Cascade
参考:https://www.raywenderlich.com/270-unreal-engine-4-particle-systems-tutorial (使用了一个飞机射击游戏的粒子来展示,全英 ...
- 【UE4】虚幻引擎技术直播汇总(含中英文直播)
B站虚幻引擎官方账号 中文直播 [中文直播]第35期 | 使用GIS在UE中创造真实地球风貌 | Epic 周澄清 [中文直播]第34期 | 包教包会的Epic MegaGrants申请之道 | Ep ...
- 在MySQL的InnoDB存储引擎中count(*)函数的优化
写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读的层面上,很少有实践,因为没有遇到真实的项目,一切都是纸上谈兵.实践是检验 ...
- Unreal Engine 虚幻引擎宣布对开发者免费
虚幻引擎4现在可供每个人免费使用,而且所有未来的更新都将免费!您可以下载引擎并将其用于游戏开发的各个方面,包括教育.建筑以及可视化,甚至虚拟现 实.电影和动画. 当您发布游戏或应用时,在您的每个游戏在 ...
- 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)
(转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例) 重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...
随机推荐
- SVG 2D入门12 - SVG DOM
使用脚本可以很方便的完成各种复杂的任务,也是完成动画和交互的一种主流方式.由于SVG是html的元素,所以支持普通的DOM操作,又由于SVG本质上是xml文档,所以也有一种特殊的DOM操作,大多称之为 ...
- OSI模型
1.物理层 •设备间接收或发送比特流 •说明电压.线速和线缆等 例子: EIA/TIA-232 V.35 2. 数据链路层 •将比特组合成字节进而组合成帧 •用MAC地址访问介质 •错误发现但不能纠正 ...
- 带卡扣的网卡接口使用小Tips,大家注意插拔网线的手法啊!
最近入手了一台X401,因为机器本身比较薄,它的网卡接口是有卡扣的,插网线的时候卡扣往下沉,这种设计应该有很多机型都采用了.但是大家有没有发现啊,这种接口的卡扣,时间长了,可能会有点松动.为了保护爱机 ...
- Qt开发环境中使用报表控件FastReport遇到的一些问题(二)
上一节中谈到的那个问题:传递的变量内容如果是纯英文,报表报错.经笔者反复测试,找到了解决办法:代码中第5行替换为以下 params<<"my_var"<<& ...
- B/S和C/S测试的区别
B/S(Brower/Server)以访问方式为主,包含客户端浏览器.web应用服务器.数据库服务器的软件系统.一般的B/S结构,都是多层架构的,有界面层.业务逻辑层.数据层.由于这种结构不需 ...
- Collection(数组、字典、集合)
Collection -NSArray和NSMutableArray +array:创建一个空数组 +arrayWithArray:从另一个数组创建新的数组 ...
- C语言数组初始化
例如: int a[15] = {0}; 第一种,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素.如果没有给出初始值,编译器不会去做初始化工作.这样简洁的方式让代码更加高效. 还 ...
- TCP/IP 协议:IP 协议
首先来看一下IP协议在实际中的位置: 我们只关系流程,不关系当前具体的服务类型 1.IP协议概述 作用: 从上图或从应用层->运输层->网络层->链路层来看,IP协议属于网络层,也就 ...
- SQL Server使用convert对datetime日期数据进行获取
来源:http://database.51cto.com/art/201007/211883.htm 备注:本文的语法讲解确实是比较乱,似乎格式不太严谨.参考时还是以实例验证为准比较好 以下的文章主要 ...
- weave
Docker的原生网络支持非常有限,且没有跨主机的集群网络方案.目前实现Docker网络的开源方案有Weave.Kubernetes.Flannel.Pipework以及SocketPlane等,其中 ...