UE5 深入之 FProperty

简介: 今天来翻阅 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 是序列化系统的核心,它提供了一个统一的接口来读写各种数据类型

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • UE必须的版权声明,否则CIS会生成失败! // Copyright XXX Games, Inc. All Ri...
    游戏开发程序员阅读 4,237评论 0 1
  • 简介: 经过前面的努力,边看,边记,边梳理,现在已经对 UE5 Solution 的结构有了一定的了解,而且也一步...
    暴走TA阅读 46评论 0 1
  • UObject相关的宏 UCLASS(...) UE类宏 UCLASS宏用于标记UObject的派生类,只能修饰...
    游戏开发程序员阅读 4,603评论 0 0
  • 伯特兰·罗素说他人生由三大激情支配着:对爱的渴望、对知识的探求、对人类痛苦的怜悯 早两天,Epic发布了UE5 E...
    离原春草阅读 13,431评论 1 4
  • 简介: 今天更新了一下UE官方源码的 release 分支,之前都是看结构和大概,现在需要看具体细节了,就更新到最...
    暴走TA阅读 1,085评论 0 3

友情链接更多精彩内容