使用虚幻引擎中的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 ...
随机推荐
- Asp.net useful tools
fuslogvw trace the assembly binding when app start up. ILdasm to inspect the manifest of the assembl ...
- 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能
2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main( ...
- 记一次PHP“Segmentation fault”调试经历
遇到的问题: 在linux上安装php5.5.26.phalcon2.0扩展.xhprof扩展,均正常安装,并可单独运行.但放在一起运行时出现“Segmentation fault”错误.注:xhpr ...
- RestTemplate 请求url
1.get 请求 RestTemplate restTemplate = new RestTemplate(); String url = ""; JSONObject resul ...
- hiho一下122周 后缀数组三·重复旋律
后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- win7 下 arp 绑定mac和Ip
我们都知道直接执行arp -s 命令即可绑定IP和MAC地址,但是在Win7下会遇到不能运行arp -s 进行静态mac绑定的情况,提示“ARP 项添加失败: 拒绝访问.”(英文版提示:The ARP ...
- aptitude解决Ubuntu各种依赖问题
转自:http://allog.ml/linux/aptitude%E8%A7%A3%E5%86%B3ubuntu%E5%90%84%E7%A7%8D%E4%BE%9D%E8%B5%96%E9%97% ...
- js中的this指针(二)
在 js 中声明并定义一个函数后,除了定义时传入的形式参数,函数还会接收到 2 个附加的参数:this 和 arguments. this 指针的值取决于调用时的模式. 当这个函数被保存为对象的一个属 ...
- Windows 10 error code 0x80072efd
访问windows 10 store出现如下图的错误: 如果你是宽带连接,删掉现在的连接,新建一个同样的宽带连接就OK了. 哎,这个问题导致我半个月没上去Windows Store,我还真以为微软有问 ...
- 需求文档2_The Battle of Polytopia
需求文档 ------------------------------------- 1. 游戏详细分析 The Battle of Polytopia简要介绍 探索型.策略型的对战塔防游戏,回合制. ...