学习虚幻C++开发日志——虚幻引擎反射系统

1.5虚幻引擎中的反射系统

反射系统通俗易懂就是虚幻引擎中用于处理游戏对象的系统。

该系统用来利用、查询以及操作关于C++类、结构体、函数 、成员变量以及枚举的信息。通过反射,虚幻可以实现序列化,GC(垃圾回收),网络复制,C++蓝图通信等重要功能

官方文档:虚幻引擎中的反射系统 | 虚幻引擎 5.4 文档 | Epic Developer Community (epicgames.com)

1.5.1反射系统工具概述

虚幻编译工具(UnrealBuldTool)和虚幻头工具(UnrealHeaderTool)这些工具是为了简化多平台编译方便用户配置更改平台的参数和编译选项。

虚幻编译工具(UnrealBuldTool,UBT,C#):该工具处理项目编译工作,逐个将引擎模块编译并逐个处理依赖,而Target.cs、Build.cs都是为为此服务,从而将项目与引擎相关联。

虚幻头工具(UnrealHeaderTool,UHT,C++):支持UObject系统的自定义解析和代码工具,其被HBT调用用来分析转换为标准C++代码

注意:​ UHT并不是一个真正的C++分析器,它只能理解这个语言的一个子集并且会尝试跳过那些它不需要的文本。只关注那些跟反射类型、函数以及属性。

概括:UBT推动UHT将改装过的虚幻引擎源码转化为标准C++代码,从而UBT编译成二进制文件。

1.5.2反射系统机制

官方文档:虚幻属性系统(反射) - Unreal Engine

​  在C#中,反射的定义是运行中的程序查看本身的元数据或其它程序的元数据的行为。所谓元数据就是有关程序及其类型(由名称、数据结构、行为及约束条件组成)的数据被称为元数据。

  总的来说反射数据描述了类在运行时的内容。这些数据所存储的信息包括类的名称、类中的数据成员、每个数据成员的类型、每个成员位于对象内存映像的偏移(offset),此外,它也包含类的所有成员函数信息。

代码中

为了标记一个头文件包含反射类型,需要在文件顶部添加一个特殊的include文件。该文件必须放在#include的最后,这让UHT知道它需要考虑这个文件,并且在反射系统的实现里也是需要的。

#include "FileName.generated.h"

声明完后,可以使用UENUM()、UCLASS()、USTRUCT()、UFUNCTION()、以及UPROPERTY()来在头文件中注解不同的类型以及成员变量。每一个宏都会出现在类型或者成员变量的前面,并且可以包含额外的修饰符关键字。

示例代码:
#include "StrategyTypes.h"
#include "StrategyChar.generated.h"

UCLASS(Abstract)
class AStrategyChar : public ACharacter, public IStrategyTeamInterface
{
    GENERATED_BODY()

    /** How many resources this pawn is worth when it dies. */
    UPROPERTY(EditAnywhere, Category = Pawn)
    int32 ResourcesToGather;

    /** set attachment for weapon slot */
    UFUNCTION(BlueprintCallable, Category = Attachment)
    void SetWeaponAttachment(class UStrategyAttachment* Weapon);

    UFUNCTION(BlueprintCallable, Category = Attachment)
    bool IsWeaponAttached();

protected:
    /** melee anim */
    UPROPERTY(EditDefaultsOnly, Category = Pawn)
    UAnimMontage* MeleeAnim;

    /** Armor attachment slot */
    UPROPERTY()
    UStrategyAttachment* ArmorSlot;

    /** team number */
    uint8 MyTeamNum;
    [more code omitted]
};

分析此代码可知该类公有继承ACharscter和IStrategyTeamInterface,在内部定义了一个GENERATED_BODY()的宏。GENERATED_BODY()在需要反射的类或结构体里面是必要的,且必须被放置在类体的最前方,它们会被替换成额外的函数和typedef。

概括:UBT推动UHT将改装过的虚幻引擎源码转化为标准C++代码,从而UBT编译成二进制文件。

注意:C++本身不支持反射,虚幻在C++的基础上搭建了自己的一套反射机制。反射系统是选择性加入的,只有主动标记的类型、属性、方法会被反射系统追踪(暴露给反射系统的类型或属性添加注解),UnrealHeaderTool(UHT)会收集这些信息,生成用于支持反射机制的C++代码,然后再编译工程。

反射系统实现原理(转)

文档来源:深入研究虚幻4反射系统实现原理(一) - 风恋残雪 - 博客园 (cnblogs.com)

Epic Games今天宣布,正式发布“虚幻引擎4”(Unreal Engine 4/UE4),相关所有资源也一并放出。# h9 u6 O( p! y& D) q4 K7 P9 ~# N   只要每个月花19美元,你就能到全部资源,包括拿过来就能用的虚幻编辑器(Unreal Editor),GitHub上的完整C++源代码(支持微软Visual Studio/苹果Xcode),还有完整的生态系统:论坛、维基、问答、协作。8 t8 q& _* ?7 K. D) S6 W 一大波新游戏要来了 虚幻4引擎正式发布, s! f+ v' w9 M j3 y: ^   而在虚幻引擎4游戏的销售中,Epic将抽取5%的毛收入提升,也就是你的游戏赚了100万美元,就要交给Epic 5万美元。   回到技术方面,Epic号称虚幻引擎4是他们多年来心血的结晶,而且现在只是第一版,才刚刚开始。C++代码里你可以看到大量的创新,比如说支持虚拟立体偷窥Oculus VR,支持Linux操作系统,以及支持Valve SteamWorks、StreamBox,而且还可以通过HTML5在网页浏览器内开发游戏(页游)。   平台支持PC、PS4、Xbox One、iOS、Google等等。   虚幻引擎4基于DirectX 11,拥有新的材料流水线、蓝图视觉化脚本、直观蓝图调试、内容浏览器、人物动画、Matinee影院级工具集、全新地形和植被、后期处理效果、热重载(Hot Reload)、模拟与沉浸式视角、即时游戏预览、AI人工智能、音频、中间件集成等一系列全新特性。   虚幻引擎4现已开始提供授权。 现在提供网盘下载地址,毕竟到官方下载很麻烦,还要$,呵呵,10分很值得,代码风格很好,注释很爽!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值