在 Unreal Engine(UE) 中,Variable(变量) 和 Property(属性) 的概念与其他编程语言类似,但结合了引擎特有的设计模式(如反射系统、蓝图可视化脚本等),因此有一些关键差异和特殊用法。
1. Variable(变量)
定义
- 在 UE 中,变量是存储数据的基本单元,可以是 原生C++变量 或 蓝图变量。
- 作用域取决于声明位置(如局部变量、类成员变量)。
特点
- C++ 中:直接定义的普通变量(如
int Count;
),没有自动的序列化或编辑器暴露功能。 - 蓝图中:通过 “Variable” 面板创建的变量,可以是任何UE支持的类型(如
Integer
、Actor Reference
等)。 - 默认无额外逻辑:仅仅是存储数据,不自动触发事件或绑定。
示例
// C++ 中的普通变量(非UE属性)
int EnemyCount;
// 蓝图中创建的变量(如 "Health" 浮点类型)
[Blueprint]
Variable Name: Health
Type: Float
Default Value: 100.0
2. Property(属性)
定义
- 在 UE 中,Property(属性) 特指通过
UPROPERTY()
宏标记的成员变量,使其具备引擎增强功能。 - 它是变量的一种,但具有额外的元数据(Metadata)和引擎集成特性。
特点
- 支持反射:UE 的反射系统可以访问这些属性(用于序列化、网络复制、蓝图调用等)。
- 编辑器集成:可在 UE编辑器 中显示、编辑,并支持细节面板(Details Panel)调整。
- 高级功能:
Replication
(网络同步)BlueprintReadOnly
/BlueprintReadWrite
(蓝图访问权限)EditAnywhere
/VisibleDefaultsOnly
(编辑权限)Category
(在编辑器中的分类)
示例
// C++ 中带 UPROPERTY() 的属性
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Gameplay")
float Health = 100.0f;
// 在蓝图中,这样的属性会自动显示在 "Details" 面板,并可供修改。
关键区别(Unreal Engine 特有)
维度 | Variable(变量) | Property(属性 UPROPERTY ) |
---|---|---|
定义方式 | 普通C++变量或蓝图变量 | 用 UPROPERTY() 宏标记的变量 |
编辑器支持 | 不显示(除非是蓝图变量) | 可显示在细节面板,并调整默认值 |
反射/序列化 | 不支持 | 支持(存档、网络复制、蓝图交互) |
网络复制 | 不能直接复制 | 可通过 Replicated 实现网络同步 |
蓝图交互 | 仅限蓝图变量 | 可通过 BlueprintReadOnly 等控制访问 |
用途 | 临时计算、内部逻辑 | 暴露给编辑器、网络同步、蓝图控制 |
UE 中的特殊规则
-
蓝图的 “Variable” 也是 Property
- 在蓝图中创建的变量,底层会被 UE 当作
UPROPERTY
处理(具备序列化、编辑器支持)。 - 但它们的灵活性不如 C++ 的
UPROPERTY
(如不能直接设置Replicated
)。
- 在蓝图中创建的变量,底层会被 UE 当作
-
C++ 普通变量 vs
UPROPERTY
- 如果变量需要在编辑器、存档或网络中使用,必须 加
UPROPERTY()
。 - 否则,它只是一个普通变量,UE 不会管理它。
- 如果变量需要在编辑器、存档或网络中使用,必须 加
-
结构体(
USTRUCT
)中的变量- 如果想在结构体中使用 UE 功能(如蓝图编辑),也需要
UPROPERTY()
。
- 如果想在结构体中使用 UE 功能(如蓝图编辑),也需要
总结(UE 最佳实践)
- 用
Variable
(普通变量):临时存储、局部计算、不涉及引擎集成的数据。 - 用
Property(UPROPERTY)
:- 需要编辑器调整的参数(如角色血量、武器伤害)。
- 需要网络同步的变量(如
Replicated
)。 - 希望蓝图读取或修改的值(如
BlueprintReadWrite
)。
示例场景
// 普通变量(仅内部使用)
float TemporaryDamage;
// UPROPERTY(编辑器可调、蓝图可读、网络同步)
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Replicated)
float MaxHealth = 200.0f;
在 UE 中,理解 UPROPERTY
的用法是高效开发的关键,它让变量变成引擎管理的“属性”,而不仅仅是数据存储。