UE C++ 学习

UBT(虚幻编译工具(UnrealBuildTool))和UHT虚幻头工具(UnrealHeaderTool)

        UE有一组用于自动执行编译虚幻引擎过程的工具,包括 UBT和UHT(以及其他工具)。实现这一套工具的目的是为了简化多平台编译,方便你配置各个平台的参数和编译选项

UBT:

  •  编译每个模块,并处理相关依赖。负责管理通过各种编译配置来编译虚幻引擎源代码的过程
  • 该工具处理所有复杂的项目编译工作,编译UE的逐个模块并处理依赖等。我们编写的Target.cs,Build.cs都是为这个工具服务的。 并将项目与引擎关联起来。该过程以透明方式进行,这样,您只需通过标准的Visual Studio 构建工作流程构建项目即可。     

.Bulid.cs 文件

        每个模块环境的依赖信息,项目包括的各种模块(一般添加组件时,需要添加模块,才能通过编译)

.Target.cs 文件

        目的或者特定平台的一些设置,包括库,头文件,编译器等信息

UHT:

  • 负责处理引擎反射系统编译所必需的信息,是支持UObject系统的自定义解析和代码生成工具
  • 代码编译分两个阶段进行:

         调用UHT。它将解析C++头文件中引擎相关类元数据,并生成自定义代码,以实现诸多UObject相关的功能。
         调用普通C++编译器,以便对结果进行编译。
  • 收集头文件,编译生成反射数据,这些反射数据存储在 .generated.h或者
    .generated.cpp中,当头文件发生改变时,通过UHT生成新的发射数据
    

完整编译流程

        UBT搜集目录中的.cs文件,然后UBT调用UHT分析需要分析的.h .cpp文件(根据文件是否含有#include、"FileName.generated.h",是否有UCLASS()、UPROPERTY等宏)生成generated.h和generated.cpp文件,生成的文件路径为 Intermediate->Build-Win64-UE4-Inc,最后UBT调用MSBuild,将.h.cpp和generated.h gen.cpp结合到一起然后编译。

        UBT通过扫描头文件,记录所有包含反射类型的modules(模块),当其中有头文件改变时,就会用UHT更新反射数据。UHT解析头文件,扫描标记,生成用于支持反射的C++代码。编译时,两个工具皆有可能出现错误,必须仔细检查。

反射

        描述运行时得到类型的功能,通过类型信息反过来创建对象,读取修改属性,调用方法的功能行为

  • 反射用于在是在程序运行时动态加载类以及获取类的信息,反射数据描述了类在运行时的内容
  • 这些数据所存储的信息包括类的名称、类中的数据成员、每个数据成员的类型、每个成员位于对象内存映像的偏移(offset),此外,它也包含类的所有成员函数信息。

作用 

  • 实现序列化
  • 实现editor的details panel
  • 垃圾回收
  • 网络复制
  • 蓝图/C++通信和相互调用

         UObject是反射系统的核心。每一个继承UObject且支持反射系统的类型都有一个相应的UClass,或者它的子类,UClass中包含了该类的描述信息。UObject与UClass也组成了UE4对象系统的基石     

实现  

        需要在文件顶部添加一个特殊的include文件,该文件必须放在#include的最后,这让UHT

检索到。

#include 文件名.generated.h"

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

        GENERATED_BODY()在需要反射的类或结构体里面是必要的,且必须被放置在类体的最前方,它们会被替换成额外的函数和typedef。 

反射实现机制简要说明

        Unreal Build Tool(UBT)和Unreal Header Tool (UHT)两个协同工作来生成运行时反射需要的数据UBT属性通过扫描头文件,记录任何至少有一个反射类型的头文件的模块。如果其中任意一个头文件从上一次编译起发生了变化,那么 UHT就会被调用来利用和更新反射数据。UHT分析头文件,创建一系列反射数据,并且生成包含反射数据的C++代码(放到每一个模块的moulde.generated.inl中。注:最新版会生成到moudle.generated.cpp中),还有各种帮助函数以及thunk函数(每一个 头文件 .generated.h)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615337.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支,各个分支相互独立,互不干扰 分支的相关命令,具体如下: git branch 查看分支 git branch [name] 创建分支&#x…

探秘大模型:《提示工程:技巧、方法与行业应用》背后的故事

提示工程是一种新兴的利用人工智能的技术,它通过设计提示引导生成式 AI 模型产生预期的输出,来提升人与 AI 的互动质量,激发 AI 模型的潜力,提升AI的应用水平。 为了让每一个人都拥有驱动大模型的能力,以微软全球副总裁…

创建SAP替代增强的过程

发现公司的凭证增强程序里没有前人写过完全替代的增强。没有完全替代增强想要实现一些复杂一点的替代就很难实现。所以我来创建一个完全替代,并且把过程记录下来,方便以后回头查看。 因为我公司已经实施过增强了,下面这个从零开始实施增强的大…

VS2022 debug调试时提示“未找到源”

1.问题 启动vs单步调试时,遇到某些特定语句会触发 未找到xxx.xx 您需要查找 xxx.xx 以通过查看源来确定当前调用堆栈帧。非调试情况下程序正常运行,调试情况下出现该问题后点击继续运行,程序正常运行,但会一直提示未找到......网…

CSS3 立体 3D 变换

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍CSS3 立体 3D 变换💎1 坐标轴💎2 perspective 透视视…

kail渗透攻击之ARP欺骗

一、什么是ARP协议? 一、什么是ARP欺骗? ARP欺骗的运作原理是由攻击者发送假的ARP数据包到网关上。其目的是要让假的ARP数据 包送至特定的IP地址的流量被错误送到攻击者所取代的地方。因此攻击者可将这些流量另行 转送到真正的网关或…

AI-数学-高中-35概率的基本(运算)性质

原作者视频:【概率】【一数辞典】4概率的基本(运算)性质_哔哩哔哩_bilibili 概率的基本(运算)性质: 1.任意一个随机事件A的发生概率>0; 2.必然事件的概率1,不可能事件概率为空;…

Flutter仿Boss-7.首页列表

效果 考察使用 Flutter Model的创建TabBar及TabBarView 的使用标签Wrap控件的使用列表ListView的使用 具体实现 今天懒的写文字了,想看具体实现的可以直接去我的github上: github:github.com/yixiaolunhui/flutter_project

LDRA Testbed软件静态分析_常见问题及处理

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

Leetcode刷题之移除元素(C语言版)

Leetcode刷题之移除元素(C语言版) 一、题目描述二、题目解析 一、题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅…

(学习日记)2024.04.18:UCOSIII第四十六节:CPU利用率及栈检测统计

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

戴尔 latitude 3490使用体验

最近体验了一下戴尔 latitude 3490,又体验了一下戴尔 latitude 3420.再把戴尔最近的主流轻薄本、当下主流轻薄本做对比. 感觉3490比3420好用,要流畅一些,但是有点重,整体设计感不如3420。 戴尔 Latitude 14 3000系列 3490(i5 82…