简介: 今天来翻阅 FProperty,它是 UE 属性系统重构后的核心。是 UE 反射系统 的核心组成部分,用于描述和管理 UObject 对象的属性(成员变量)
FProperty
FProperty 在 /Engine/Source/Runtime/CoreUObject/ 下
FProperty 的实际定义位置在 Engine/Source/Runtime/CoreUObject/Public/UObject/UnrealType.h 头文件内
FProperty 继承自 -> FFied
FField 包含很多常用的方法,也适合多看一眼
继承体系
FProperty 有很多的具体实现类如下表,他们对应了不同的数据类型
| 类型 |
类名 |
功能描述 |
典型应用场景 |
| 基础数值 |
FNumericProperty |
数值类型基类 |
所有数值类型的基础 |
| 基础数值 |
FFloatProperty |
单精度浮点数 |
位置、旋转、缩放 |
| 基础数值 |
FDoubleProperty |
双精度浮点数 |
高精度数学计算 |
| 基础数值 |
FIntProperty |
32位整数 |
血量、数量、状态ID |
| 基础数值 |
FInt64Property |
64位整数 |
唯一标识、大数值 |
| 布尔 |
FBoolProperty |
布尔类型 |
开关状态、标志位 |
| 字符串 |
FNameProperty |
不可变名称 |
资源引用、枚举名 |
| 字符串 |
FStrProperty |
可变字符串 |
玩家名称、描述文本 |
| 字符串 |
FTextProperty |
本地化文本 |
国际化UI文本 |
| 对象引用 |
FObjectProperty |
UObject 引用 |
场景中的Actor |
| 对象引用 |
FClassProperty |
UClass 引用 |
类类型选择 |
| 对象引用 |
FWeakObjectProperty |
弱引用 |
避免循环引用 |
| 对象引用 |
FSoftObjectProperty |
软引用 |
异步加载资源 |
| 结构体 |
FStructProperty |
UStruct 类型 |
向量、变换等 |
| 容器 |
FArrayProperty |
动态数组 |
物品栏、列表 |
| 容器 |
FMapProperty |
键值对 |
属性映射、缓存 |
| 容器 |
FSetProperty |
唯一集合 |
标签系统、特性 |
| 委托 |
FDelegateProperty |
单播委托 |
事件响应 |
| 委托 |
FMulticastDelegateProperty |
多播委托 |
事件广播 |
核心功能特性
| 方法 |
说明 |
使用场景 |
| InitializeValue() |
初始化属性内存 |
对象创建时 |
| DestroyValue() |
清理属性内存 |
对象销毁时 |
| CopyCompleteValue() |
深拷贝属性值 |
对象复制 |
| ContainerPtrToValuePtr() |
获取属性内存地址 |
动态访问 |
| SetPropertyValue() |
设置属性值 |
反射修改 |
| GetPropertyValue() |
获取属性值 |
反射读取 |
| 方法 |
说明 |
调用时机 |
| Serialize() |
基础序列化方法 |
存档/加载 |
| NetSerializeItem() |
网络序列化 |
数据复制 |
| ExportTextItem() |
文本导出 |
编辑器显示 |
| ImportText() |
文本导入 |
编辑器修改 |
| ShouldSerializeValue() |
序列化条件检查 |
按需序列化 |
| 功能 |
实现方式 |
应用场景 |
| 蓝图访问 |
HasAnyPropertyFlags(CPF_BlueprintVisible) |
蓝图中显示属性 |
| 编辑器控制 |
MetaData 元数据 |
属性面板控制 |
| 标签系统 |
UObject::GetSupportedClasses() |
编辑器中筛选 |
| 版本迁移 |
SerializeFromMismatchedTag() |
数据升级 |
UPROPERTY 元数据使用
| 元数据键 |
类型 |
说明 |
示例 |
| Category |
String |
属性分类 |
Category="Gameplay" |
| DisplayName |
String |
显示名称 |
DisplayName="Player Health" |
| Tooltip |
String |
悬停提示 |
Tooltip="Current health value" |
| UIMin/UIMax |
Number |
UI显示范围 |
UIMin=0, UIMax=100 |
| ClampMin/ClampMax |
Number |
数值限制 |
ClampMin=0, ClampMax=1 |
| Units |
String |
单位显示 |
Units="cm" |
| Bitmask |
- |
位掩码 |
Bitmask, BitmaskEnum="ECollisionFlags" |
| BlueprintProtected |
- |
蓝图保护 |
BlueprintProtected |
| 标志 |
C++宏 |
功能 |
| VisibleAnywhere |
CPF_Edit |
CPF_EditConst |
任何地方可见但不可编辑 |
| EditAnywhere |
CPF_Edit |
任何地方可编辑 |
| VisibleDefaultsOnly |
CPF_Edit |
CPF_DisableEditOnInstance |
仅在类默认值可见 |
| EditDefaultsOnly |
CPF_Edit |
CPF_DisableEditOnInstance |
仅在类默认值可编辑 |
| BlueprintReadOnly |
CPF_BlueprintVisible |
CPF_BlueprintReadOnly` |
蓝图只读 |
| BlueprintReadWrite |
CPF_BlueprintVisible |
蓝图可读写 |
| Transient |
CPF_Transient |
不序列化 |
| SaveGame |
CPF_SaveGame |
存档到保存游戏 |
阅读记录
DECLARE_FIELD_API 宏,DECLARE_FIELD_API(TClass, TSuperClass, TStaticFlags, TRequiredAPI),根据传入的参数,生成一些列的通用函数
EPropertyFlags 属性标签,很多标签,例如是否是蓝图可见,是否蓝图可修改,是否允许自引用等等
TEnumAsByte<ELifetimeCondition> TEnumAsByte 是模板类,用于封装 枚举类,确保枚举在内存中占用精确的1字节(8int),c++ 的枚举默认使用 4 字节(int32)
BlueprintReplicationCondition 蓝图复制条件
template<typename T> 模板函数,类似于 C# 中在函数名后面加 <T>,这个是放在整个函数声明的前面的
FArchive 是序列化系统的核心,它提供了一个统一的接口来读写各种数据类型