使用虚幻引擎中的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 - 方法可被蓝图调用。

有太多特定的标志,下面的链接可以看到这些标志的详细内容。

List of UCLASS Specifiers

List of UPROPERTY Specifiers

List of UFUNCTION Specifiers

List of USTRUCT Specifiers

对象/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++导论(三-反射系统与迭代器)的更多相关文章

  1. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  2. 使用虚幻引擎中的C++导论(二-UE4基类)

    使用虚幻引擎中的C++导论(二) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...

  3. 使用虚幻引擎中的C++导论(一-生成C++类)

    使用虚幻引擎中的C++导论(一) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...

  4. 虚幻引擎中的数组---TArray: Arrays

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/45367171 作者:ca ...

  5. [原][unreal][UE][spark]分析unreal engine 虚幻引擎的粒子编辑器:Cascade

    参考:https://www.raywenderlich.com/270-unreal-engine-4-particle-systems-tutorial (使用了一个飞机射击游戏的粒子来展示,全英 ...

  6. 【UE4】虚幻引擎技术直播汇总(含中英文直播)

    B站虚幻引擎官方账号 中文直播 [中文直播]第35期 | 使用GIS在UE中创造真实地球风貌 | Epic 周澄清 [中文直播]第34期 | 包教包会的Epic MegaGrants申请之道 | Ep ...

  7. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读的层面上,很少有实践,因为没有遇到真实的项目,一切都是纸上谈兵.实践是检验 ...

  8. Unreal Engine 虚幻引擎宣布对开发者免费

    虚幻引擎4现在可供每个人免费使用,而且所有未来的更新都将免费!您可以下载引擎并将其用于游戏开发的各个方面,包括教育.建筑以及可视化,甚至虚拟现 实.电影和动画. 当您发布游戏或应用时,在您的每个游戏在 ...

  9. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

随机推荐

  1. CBC和CTR解密模式——C++实现

    利用已经封装好的AES加密算法,实现CBC模式加密和CTR模式加密. (1)CBC解密 如图,CBC模式的解密,步骤主要有三个,首先是拿密文段逐一放到AES解密盒子里面得到一个结果temp(事先要把密 ...

  2. 团队开发——冲刺1.b

    冲刺阶段一(第二天) 1.昨天做了什么? 在了解C#的基础上,深入熟悉Windows窗体应用程序,熟练掌握基本功能 2.今天准备做什么? 在C#的Windows窗体应用程序中,设计简单的游戏开始主界面 ...

  3. HDU 1829 分组并查集

    题意:有两种性别,每组数据表示是男女朋友,判断输入的几组数据是否有同性恋 思路:http://blog.csdn.net/iaccepted/article/details/24304087 分组并查 ...

  4. 【渗透测试学习平台】 web for pentester -4.XML

    example1: http://192.168.91.139/xml/example1.php?xml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%2 ...

  5. Codeforces Round #162 (Div. 2)

    A. Colorful Stones (Simplified Edition) 模拟. B. Roadside Trees (Simplified Edition) 每次转移时,只需要爬到\(min( ...

  6. 程序跳转到访问一个确定的地址0x100000

    用函数指针 把这个确定的地址转化成一个函数指针 这就明白了程序中调用函数的意义 测试代码如下: #include <stdio.h> void getMemory() { printf(& ...

  7. JSBinding / About JSComponent and Serialization

    About JSComponent JSCompnent is a normal Unity script. It inherits from JSSerializer and JSSerialize ...

  8. Python字典实现三级菜单

    ################################################ # Task Name: 三级菜单 # # Description:打印省.市.县三级菜单 # # 可 ...

  9. PHP 数组 foreach引用导致的bug

    <?php $arr = array('a', 'b', 'c'); foreach($arr as &$v) {} foreach($arr as $v) {} var_dump($a ...

  10. mysql-创建库之问题

    一.在登入mysql命令行,创建数据库时报错 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'xiaolu ...