【UE4】反射系统分析(一)

UE4-(反射)反射采集 一、现在有两个反射采集形状:球体和盒体 通常将屏幕空间反射和反射捕获相结合,两者各有优缺点,结合使用是希望同个结合两者的优点来弥补缺点。 大多情况下使用球体反射采集: 效果:不管怎么移动相机位置,屏幕上都会有反射效果。 问题: 当反射采集与屏幕空间反射过渡时,反射画面中的物体位置会发生变化。 原因:当屏幕空间反射过渡到反射捕获,引擎会切换使用两者,但是屏幕空间反射的优先级始终更高。 解释:反射采集会采集一张360度的瞬时图像,用于反射效果。图像中的物体位置与屏幕空间反射出来的物体位 阅读详情

一、反射的宏标记

  在编写UE4 C++代码时,我们经常使用UCLASS()、USTRUCT()、UENUM()、UFUNCTION()、UPROPERTY()等宏去标记我们的类和成员变量,只有添加这些宏的类或成员才能将其添加到反射系统。这样,基于UE4反射的GC系统等可以管理我们的反射数据。举例而言,当一个继承UObject的类对象指针被声明时,如果不使用UPROPERTY将其标记,则GC不能察觉到它的存在,也就不能对其进行管理。当GC认为没有其它对象包含该对象的指针引用时,将对其回收,那么此成员变量将会成为野指针,这个操作是有风险的。所以,我们应该主动用UPROPERTY标记,由UE4的GC帮我们管理该成员指针。或者使用AddToRoot方法,防止GC。
  在宏标记中,我们可以选择性的添加标识符,以决定被反射数据可以在哪里使用、如何被使用。有选择性添加标识符,可以减少不必要的反射数据,这样做可以节省元数据所占用的内存。

二、反射数据

  被反射的类或变量等数据将会被保存在元数据当中。也就是说通过元数据对象,我们可以获取到被反射类或成员的所有数据,比如类名、继承关系、包含的成员变量、类型信息等。元数据类的继承关系如下:
UE4反射元数据类图

UObject
UField
UStruct
UClass
UScriptStruct
UFunction
UEnum
UProperty
  • UClass: C++类,UClass将会包含成员变量、成员函数和继承的子类等数据。
  • UStructStruct: C++结构体。
  • UFunction:C++函数方法。
  • UEnum:C++枚举类。
  • UProperty:C++类或结构体的成员变量。注意:嵌套模板和部分类型不能被反射,如TArray、TMap的嵌套。

获取类和结构体的元数据
  对于继承UObject类的子类,我们可以使用静态方法StaticClass()获取该类的反射对象(元数据)。而对于结构体,可以使用StaticStruct()获取结构体的反射数据。继承UObject类的实例,也可以使用GetClass()来获取元数据,而结构体对象则不可以。
获取被反射的成员变量的元数据
继承UStruct的UClass和UScriptStruct是聚合结构体的元数据,可以通过它们得到类包含的成员,例如遍历获取类包含的被反射的成员变量:

for(TFieldIterator<UProperty> It(GetClass()); It; ++It)
{
	UProperty* Prop = *It;
}

获取被反射方法的元数据
  上面是通过类的元数据获取类的成员变量元数据的方法,那如果要获取类的反射方法,可以调用类对象的FindFunction方法或者类元数据的FindFunctionByName方法来获取反射方法的元数据。

UFunction* Func = ObjectSelf->FindFunction(FName FuncName);
UFunction* Func = ObjectSelf->GetClass()->FindFunctionByName(FName FuncName);

获取被反射枚举的元数据
  通过FindObject可以获取任意的UObject类对象,枚举的反射数据被保存在UEnum类实例中,而UObject又是UEnum的(祖)父类。所以,我们可以通过FindObject来获取枚举类的反射数据对象。

//所所有包中查找名为EnumName的枚举类的反射数据,并精准匹配。
UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);

三、UBT和UHT

UBT主要负责各模块的编译及各模块之间的依赖关系,比如解析Build.cs等文件。而UHT则会为我们编写的UE4 C++代码进行反射处理,比如在gen.cpp和generated.h文件中生成反射代码等。

UBT

UBT可以解析项目的Target.cs和模块的build.cs等文件,这些文件代码使用C#进行编码配置。UBT还会从以下XML配置文件中读取配置数据,然后用于构建编译项目:

  • Engine/Saved/UnrealBuildTool/BuildConfiguration.xml
  • User Folder/AppData/Roaming/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
  • My Documents/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml

项目Target.cs
下面是项目的一般的Target.cs文件的一般结构:

using UnrealBuildTool;
using System.Collections.Generic;
public class MyProjectTarget : TargetRules
{
    public MyProjectTarget(TargetInfo Target) : base(Target)
    {
        Type = TargetType.Game;
        ExtraModuleNames.AddRange( new string[] { "StartWork", "ProjectEditor" } );
        // 其它属性配置
    }
}

UBT支持构建以下类型的项目,对应于配置文件中的Type值:

  • Game 游戏项目
  • Client 和Game相似,但是不包含服务器代码
  • Server 不包含客户端代码
  • Editor 编辑器模块
  • Program 独立程序

ExtraModuleNames是一个字符串数组列表,被包含在此列表中的模块将被编译到Target中。这些模块就是项目源码目录下的模块内容。
其它属性变量

模块build.cs
build.cs中属性变量说明
编译配置
编译配置文件中的设置说明

UHT

UHT是支持对UObject系统的代码解析和生成工具。它可以C++头文件中引擎相关的类元数据,并生成反射代码。可以在generated.h和gen.cpp文件中查看生成的反射代码。更详细的generated文件的解析,后续介绍。

参考文章

深入研究虚幻4反射系统实现原理(一)
UnrealBuildTools

UE4 C++ 利用反射获取到类、类的成员 一、获取到特定类的对象实例 1.1、GetObjectsOfClass GetObjectsOfClass(类型::GetStaticClass(),存储结果的数组); TArray<UObject*> Objs; GetObjectsOfClass(UClass::StaticClass(), Objs); TArray<UObject*> ActorObjs; ... 阅读详情

相关推荐

UE5反射系统分析(一)generated.h

我们大致分析了中的生成代码,对代码中的不同宏和函数有了一个初步的了解。接下来,我们需要深入到中,看看它们的具体实现,以及在反射系统中的用途,和调用的时机。

异次元的归来 1409

UE4 C++反射从入门到原理剖解(UE4 4.26)

UE4 C++反射具体应用案例 测试反射类ATestActor // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "TestActor.generated.h" UCLASS(Blueprintable, meta = (Dis..

qq_29523119的博客 7167

UE5实战:用C#给《黑神话悟空》战斗系统做扩展开发(附避坑指南)

本文详细介绍了如何在UE5中使用C#进行《黑神话悟空》战斗系统的扩展开发,包括环境搭建、USharp插件魔改、战斗系统架构设计、il2cpp打包优化等关键步骤。通过实战案例和避坑指南,帮助开发者克服UE5原生不支持C#的障碍,提升开发效率和性能表现。

weixin_29009081的博客 424

UE4_UStruct 遍历

一个结构体中存在一个Val变量,Val变量的类型是FVector4,想从c++层面去遍历获得Val的值 上图是很早之前的一个Property继承关系图。 当然,在4.25UProperty被FProperty夺笋。 好处呢,见下: 没有继承UObject后的开销 提高了引擎启动时间 提高GC处理时间明显 内存使用量的减少 打包后包体体积减少 自定义结构体的遍历 USTRUCT(BlueprintType, meta=(HiddenByDefault)) struct FPostProcessSetti.

longyanbuhui的博客 2369

华为项目TR5评审后发现了重大缺陷的应急处理经验

华为TR5评审后发现重大缺陷时,启动分级应急机制:1)缺陷分级:按严重性(致命/严重/一般)评估影响;2)应急响应:跨部门会议制定方案,冻结生产并调配资源;3)根因修复:通过RCA定位问题,设计变更后回归测试;4)变更管理:评审修复影响,调整发布策略;5)持续改进:记录缺陷闭环,优化流程。案例显示,软件闪退问题通过热修复补丁和代码重构解决。关键工具包括Jira、FMEA等,确保缺陷在量产前拦截,降低风险。

从技术实践立足,从项目管理方法论延伸思考 1069

KAN神经网络实战:如何用Python快速搭建你的第一个可解释性模型

本文提供了使用Python和PyTorch快速搭建首个KAN(Kolmogorov-Arnold Networks)神经网络模型的实战指南。通过对比传统MLP,详细解析了KAN利用可学习的边函数实现更高可解释性的核心原理,并逐步演示了从环境配置、数据准备、核心模块实现到模型训练与可视化的完整流程,帮助开发者掌握这一新兴的可解释性AI模型构建方法。

convnet3designer的博客 473

UE4反射原理(转)

转自: https://blog.youkuaiyun.com/mohuak/article/details/81913532 https://blog.youkuaiyun.com/u012999985/article/details/52902065 1. UE4反射系统 什么是反射系统 在UE4里面,你无时无刻都会看到类似UFUNCTION()这样的宏。官方文档告诉你,只要在一个函数的前面加上这个宏,然后在括号里面加上BlueprintCallable就可以在编辑器里面调用了。按照他的指示,我们就能让我们的函数实现各种各样特

weixin_42111061的博客 1392

VL53L0X测距不准?手把手教你做RefSPAD校准与环境补偿(附Arduino/STM32代码)

本文详细解析了VL53L0X激光测距传感器精度不足的原因,并提供了RefSPAD校准与环境补偿的完整解决方案。通过Arduino和STM32代码示例,手把手教你实现毫米级测距稳定性,适用于机器人避障、工业检测等场景。

weixin_28744423的博客 256

5步掌握FModel:解锁虚幻引擎游戏资源的终极指南

FModel是一款基于CUE4Parse解析库构建的虚幻引擎游戏资源浏览器,专门用于探索和提取UE4/UE5游戏的Pak文件资源。这款开源工具为游戏开发者、MOD制作者和技术爱好者提供了强大的资源管理能力,让你能够深入游戏内部,轻松浏览、预览和导出各种游戏资源。无论你是想要研究游戏美术资源,还是制作个性化MOD,FModel都能成为你的得力助手。 ## 为什么选择FModel进行游戏资源探索?

gitblog_00606的博客 284

Flutter热更新实战:Shorebird从安装到发布补丁的完整流程(含iOS/Android差异解析)

本文详细介绍了Flutter热更新工具Shorebird的完整使用流程,包括安装、发布补丁及iOS/Android平台差异解析。Shorebird作为Flutter官方未提供的Code Push解决方案,能快速修复线上问题,支持合规性保障和性能优化,特别适合紧急修复场景。文章还涵盖了国内CDN加速配置和最佳实践,帮助开发者高效实现热更新。

butter的博客 1078

基于高斯两步移动搜寻法(2SFCA)的城市绿地可达性分析

第二步,对于每一个街道i,给定空间距离阈值d0,便形成另一个空间作用域,同样对于落在空间作用域内的每块绿地l的供给比率(Rl)利用高斯方程赋以权重,然后对这些加权后的供给比率(Rl)进行加和,便得到每个街道i的绿地可达性Ai。图3与图4是高斯两步移动搜索法的示例。在图3中,以d0为阈值,有1、2、3 三个街道中心点落在了绿地a的空间作用域内。同样在图4中,以d0为阈值,有a、c两个绿地中心点落在了街道2的空间作用域内,根据公式(3),对a、c高斯方程加权后的供需比率进行累加,便得到了街道2 的绿地可达性。

2301_77310370的博客 2404

终极指南:如何使用FModel轻松探索虚幻引擎游戏资源

你是否曾经好奇热门游戏如《堡垒之夜》和《Valorant》内部的资源是如何组织的?想要提取游戏中的精美模型、纹理和音频资源,却苦于找不到合适的工具?FModel正是你需要的解决方案!这款基于CUE4Parse解析库构建的虚幻引擎游戏资源浏览器,专门用于探索和提取UE4/UE5游戏的Pak文件资源。无论你是游戏开发者、MOD制作者还是技术爱好者,FModel都能为你打开游戏内部世界的大门。 ##

gitblog_00935的博客 146

【Unity】【2D】用连续图片生成动画Animation的简明步骤

本文介绍了Unity中使用2D连续图片制作2D动画Animation的简明步骤。

O青草O的博客 Unity和游戏制作知识分享 718

【UE4】反射系统分析(二)

文章目录INCLASS_NO_PURE_DECLSENHANCED_CONSTRUCTORS 这节主要分析一下generated.h文件中的代码。首选先创建一个继承AActor的类,并编译,UHT会生成一个generated.h文件。下边来分析一下AActor类中的GENERATED_BODY()宏的作用。 #define BODY_MACRO_COMBINE_INNER(A,B,C,D) A##B##C##D #define BODY_MACRO_COMBINE(A,B,C,D) BODY_MACRO_C

胡嘿嘿 1281

【RT-DETR涨点改进】独家Conv改进篇 | 来自TIP 2024顶刊| 引入 DEConv细节增强卷积模块, 能够恢复更多细节信息,提升小目标检测精度、含多种不同模型改进点

本文提出了一种细节增强卷积(DEConv)模块,通过融合多种差异卷积(CDC、ADC、HDC、VDC)来增强图像特征表示能力,特别在边缘和纹理细节提取方面表现突出。该模块采用重参数化技术,在不增加计算成本的情况下,将先验信息融入常规卷积层,显著提升了RT-DETR模型在模糊或遮挡场景下的目标检测精度。实验验证了DEConv在多种骨干网络(ResNet18/50、HGNet等)中的有效性,为实时目标检测系统提供了轻量高效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 449

手把手教你五种方案配置Obsidian免费同步,全平台通用(支持Alist/OpenList)

Obsidian是一款优秀的Markdown笔记工具,但官方同步服务每年近700元让人望而却步💸 本文整理了5种免费同步方案,涵盖苹果生态专属方案、多网盘插件同步、版本管理同步、点对点同步、自建实时同步等不同场景📱💻 每种方案都附有详细配置步骤,助你找到最适合的同步方式✨

XiaoqiangClub的博客 1832

终极指南:5步掌握FModel虚幻引擎游戏资源浏览器

FModel是一款强大的虚幻引擎游戏资源浏览器,专门用于探索和提取UE4/UE5游戏的Pak文件资源。这款开源工具基于CUE4Parse解析库构建,为游戏开发者、MOD制作者和技术爱好者提供了专业的资源管理能力,让你能够深入游戏内部,轻松浏览、预览和导出各种游戏资源。 ## 为什么选择FModel进行游戏资源探索? 在众多游戏资源提取工具中,FModel凭借其独特的技术优势脱颖而出。作为一款专

gitblog_01010的博客 227

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

5步掌握FModel:高效探索虚幻引擎游戏资源的专业工具

FModel是一款基于CUE4Parse解析库构建的虚幻引擎游戏资源浏览器,专门用于探索和提取UE4/UE5游戏的Pak文件资源。这款开源工具为游戏开发者、MOD制作者和技术爱好者提供了强大的资源管理能力,让你能够深入游戏内部,轻松浏览、预览和导出各种游戏资源。无论你是想要研究游戏美术资源,还是制作个性化MOD,FModel都能成为你的得力助手。 ## 为什么选择FModel进行游戏资源探索?

gitblog_00726的博客 140

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

UE5.3 C++蓝图无法打开:系统性诊断与修复指南

在虚幻引擎开发中,蓝图系统作为可视化脚本工具,极大地提升了开发效率,而其与C++原生代码的协同工作则是构建高性能、复杂功能的核心。理解其底层原理,关键在于引擎的反射机制,它允许C++类、属性和函数在运行时被蓝图系统识别和调用,从而实现逻辑与表现的分离。这一机制的技术价值在于,开发者既能利用C++的高性能与精细控制,又能享受蓝图快速迭代和可视化编排的优势,是大型项目开发的基石。然而,在实际工程实践中,尤其是在UE5.3版本中,C++与蓝图间的通信链路可能因编译错误、反射标记不符或资产序列化问题而中断,具体表现

weixin_33050117的博客 290

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

UE4SS深度解析:无需源码即可掌控Unreal Engine游戏的完整方案

UE4SS(Unreal Engine 4/5 Scripting System)是一个革命性的游戏脚本系统,为UE4/5游戏提供了Lua脚本平台、C++ Modding API、SDK生成器和实时属性编辑器等强大功能。无论你是想要为喜爱的游戏添加新功能,还是深入探索游戏内部机制,UE4SS都能为你提供完整的工具链支持。 ## 🔍 三大核心场景:你的UE4SS使用路径选择 ### 场景一:逆

gitblog_00101的博客 177

UE4SS在Unreal Engine 5.4中的兼容性现状:开发者必知的7个关键点

作为Unreal Engine游戏模组开发的核心工具链,UE4SS的版本兼容性直接影响着开发者的工作效率。随着Unreal Engine 5.4的广泛应用,许多开发者面临工具链适配的挑战。本文将深入剖析UE4SS对UE5.4的支持现状,为开发者提供实用的技术指导。 ## 🎯 现状速览:UE5.4支持的真实状态 **当前定位:实验性支持阶段** UE4SS对Unreal Engine 5.

gitblog_01180的博客 164

UE5源码分析之Editor——AudioEditor模块全面分析

AudioEditor模块分析摘要 AudioEditor是UE5中负责音频资产编辑的核心模块,主要提供SoundCue、SoundClass和SoundSubmix三大图形化编辑器工具。该模块包含100+源文件,分为公开接口和私有实现层,依赖CoreUObject、Engine、GraphEditor等核心模块,并集成libsndfile等第三方音频库。 关键特性包括: SoundCue节点编辑器 - 可视化编排音频播放逻辑 SoundClass层级管理器 - 控制音频分组和音量 SoundSubmix混

chouchouxia的博客 512

UE5源码分析之Editor——ComponentVisualizers模块全面分析

属性值模块名称类型Editor(仅编辑器)描述为编辑器中各种组件提供视口内的可视化辅助编辑功能位置操作实现方法点击选择关键帧→拖拽移动关键帧→拖拽切线手柄→Alt+拖拽在曲线上添加关键帧在端部添加关键帧框选/视锥选择删除关键帧吸附到 Actor→右键菜单ComponentVisualizers 是编辑器基础设施:它不做运行时的事,纯粹在编辑器视口中提供视觉辅助。理解这一点有助于区分"渲染调试"和"可视化编辑"的边界。FComponentVisualizer 的接口设计很克制。

chouchouxia的博客 241

UE5源码分析——AdvancedPreviewScene模块全面分析

AdvancedPreviewScene模块摘要 AdvancedPreviewScene是Unreal引擎的编辑器模块,提供高级预览场景功能,包含可配置的环境光照、天空球和后处理等工具。该模块核心类包括FAdvancedPreviewScene(场景控制器)、FPreviewSceneProfile(场景配置)和UAssetViewerSettings(配置管理器)。模块架构分为三层:编辑器视口层(如网格/材质/动画编辑器)、核心场景层(处理光照/天空/地板等组件)和数据管理层(配置档案与命令系统)。

chouchouxia的博客 222

UE5源码分析之Editor——BlueprintEditorLibrary模块全面分析

BlueprintEditorLibrary模块分析摘要 BlueprintEditorLibrary是UE引擎中一个编辑器模块,提供程序化操作蓝图资产的工具函数集。核心功能包括: 节点升级与变量管理:支持批量替换旧节点、增删修改变量 函数图操作:创建/删除/重命名函数图 蓝图编译与清理:编译蓝图、移除无效节点、修改父类 类型系统构建:封装FEdGraphPinType的构造过程 资产创建:程序化生成蓝图资产 该模块通过封装底层编辑器API(如FBlueprintEditorUtils),为蓝图工具开发提供

chouchouxia的博客 437
上一篇: 3D图形数学基础(二)向量
下一篇: 【UE4】反射系统分析(二)
Im 胡嘿嘿
博客等级 码龄10年 148粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值