为什么 UPROPERTY 说明符 Visible*/Edit* 与 BlueprintRead* 一起使用
Why the UPROPERTY specifiers Visible*/Edit* are used together with BlueprintRead*
Unreal Engine 4 提供了三个说明符来控制通过 UPROPERTY()
.
暴露给蓝图的 C++ class 成员的可见性和可编辑性
UE4 source code (see also UE4 wiki, UE4 documentation) 中的文档说明了以下关于可编辑性的内容:
- 对于
VisibleAnywhere
、VisibleInstanceOnly
、VisibleDefaultsOnly
:
... cannot be edited at all.
EditAnywhere
、EditInstanceOnly
、EditDefaultsOnly
:
... can be edited ...
对于BlueprintReadOnly
:
... can be read by blueprints, but not modified.
和BlueprintReadWrite
:
... can be read or written from a blueprint.
问题:
由于 Visible*
说明符已经将使用限制为 只读 在蓝图中,为什么它与 BlueprintReadOnly
一起使用?第二个说明符不是多余的吗?示例:
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
UMyActorComponent* MyActorComponent;
更令人困惑的是 Edit*
说明符的用法,它允许 read 和 write 在 Blueprint 中,连同 BlueprintReadOnly
which在蓝图中限制为只读。两个说明符不是 对立 吗?示例:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UMyActorComponent* MyActorComponent;
Visible*
/Edit*
说明符在与 BlueprintRead*
说明符不同的上下文中是否有效? (问题不在于 InstanceOnly
(例如 属性 windows)、DefaultsOnly
(属性 windows 对于原型)和 Anywhere
(实例和原型))
tl;dr
Visible*
/Edit*
说明符允许您(通常是游戏设计师)直接在蓝图编辑器中 access/modify 变量以快速配置 class 属性。
BlueprintRead*
允许您在执行 Visual Scripting[时 get/set Event Graph 中的变量值=117=].
解释:
官方文档中的一些命名和解释确实有点模糊,尤其是对于初学者。简而言之,Visible*
/Edit*
和 BlueprintRead*
都将 class 中的变量暴露给 Unreal Engine,但做不同的事情。其实问题2和问题3都可以通过问题1来回答。看看你的问题1:
Since the Visible*
specifiers already restrict the usage to read only in Blueprints, why it is used in conjunction with BlueprintReadOnly
? Isn't the second specifier superfluous? Example:
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
UMyActorComponent* MyActorComponent;
在这里,您向引擎公开了一个 ActorComponent
。这里我首先解释一个非Component
成员变量,因为Component
"appears"的说明符与非Component
变量的工作方式不同。
假设我有一个 TpsCharacter
class 作为第三人称射击游戏角色,它有以下 3 float
个变量:
// The zooming speed
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float ZoomSpeed;
// The FOV after zoom in
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float ZoomInFov;
// The default FOV
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float DefaultFov;
都指定为EditDefaultsOnly
,也就是说,我们基于这个C++class创建一个名为TpsCharacter_BP
的蓝图class,然后打开这个蓝图,这3个变量的值可以在这个蓝图class的细节面板中编辑,如图:
当然,通过使用 Visible*
说明符,它们是只读的(在 详细信息面板 中显示为灰色),因此您无法更改它们的值。
现在让我们回到您的 MyActorComponent
。就像我说的,Component
的说明符工作方式有些不同。
Component
与其所有者 class 一起出现在 组件面板 中,而不是 详细信息面板 就像一个非 Component
变量。
- 如果
Component
既没有 Visible*
也没有 Edit*
说明符,这个 Component
本身 总是 出现在编辑器,但您无法访问此组件内的 properties/variables。,并且此 Component
的 详细信息面板 将是空的。
Visible*
说明符允许您通过其 详细信息面板 访问 Component
的属性,就像访问我的 [=27] 中的 3 个变量一样=] class。但是,当您将其声明为 Edit*
时, 详细信息面板 将显示连线设置,允许您修改 指针值 这个 Component
而不是它的内容。这绝对是你应该始终避免的一件事。
Component
的经验法则:永远不要 将它们声明为 Edit*
因为它允许您更改指向其他事物的指针值;总是做 Visible*
。对于非 Component
对象,您可以自由设置 Edit*
.
现在更容易理解 BlueprintRead*
说明符。有Visible*
是不是多此一举? BlueprintReadOnly
是否反对 Edit*
说明符?绝对没有。它们在不同的上下文中有效吗?是的。 BlueprintRead*
说明符允许您在蓝图编辑器的 事件图表 中 read/write 变量,也就是说,当您执行蓝图可视化脚本时。对于上面的 TpsCharacter
class,由于所有 3 个变量都声明为 BlueprintReadOnly
,因此我可以在 事件图 中获取它们的值,如下所示:
您可以为您的 MyActorComponent
做同样的事情。通过使用 BlueprintReadWrite
,您还可以在 Event Graph.
中设置这些变量的值
我写了这么长的答案来解释,因为它们虽然实际上是简单的概念,但确实会让初学者感到困惑。
Unreal Engine 4 提供了三个说明符来控制通过 UPROPERTY()
.
UE4 source code (see also UE4 wiki, UE4 documentation) 中的文档说明了以下关于可编辑性的内容:
- 对于
VisibleAnywhere
、VisibleInstanceOnly
、VisibleDefaultsOnly
:... cannot be edited at all.
EditAnywhere
、EditInstanceOnly
、EditDefaultsOnly
:... can be edited ...
对于
BlueprintReadOnly
:... can be read by blueprints, but not modified.
和
BlueprintReadWrite
:... can be read or written from a blueprint.
问题:
由于
Visible*
说明符已经将使用限制为 只读 在蓝图中,为什么它与BlueprintReadOnly
一起使用?第二个说明符不是多余的吗?示例:UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly) UMyActorComponent* MyActorComponent;
更令人困惑的是
Edit*
说明符的用法,它允许 read 和 write 在 Blueprint 中,连同BlueprintReadOnly
which在蓝图中限制为只读。两个说明符不是 对立 吗?示例:UPROPERTY(EditAnywhere, BlueprintReadOnly) UMyActorComponent* MyActorComponent;
Visible*
/Edit*
说明符在与BlueprintRead*
说明符不同的上下文中是否有效? (问题不在于InstanceOnly
(例如 属性 windows)、DefaultsOnly
(属性 windows 对于原型)和Anywhere
(实例和原型))
tl;dr
Visible*
/Edit*
说明符允许您(通常是游戏设计师)直接在蓝图编辑器中 access/modify 变量以快速配置 class 属性。BlueprintRead*
允许您在执行 Visual Scripting[时 get/set Event Graph 中的变量值=117=].
解释:
官方文档中的一些命名和解释确实有点模糊,尤其是对于初学者。简而言之,Visible*
/Edit*
和 BlueprintRead*
都将 class 中的变量暴露给 Unreal Engine,但做不同的事情。其实问题2和问题3都可以通过问题1来回答。看看你的问题1:
Since the
Visible*
specifiers already restrict the usage to read only in Blueprints, why it is used in conjunction withBlueprintReadOnly
? Isn't the second specifier superfluous? Example:
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly) UMyActorComponent* MyActorComponent;
在这里,您向引擎公开了一个 ActorComponent
。这里我首先解释一个非Component
成员变量,因为Component
"appears"的说明符与非Component
变量的工作方式不同。
假设我有一个 TpsCharacter
class 作为第三人称射击游戏角色,它有以下 3 float
个变量:
// The zooming speed
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float ZoomSpeed;
// The FOV after zoom in
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float ZoomInFov;
// The default FOV
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Camera Zoom")
float DefaultFov;
都指定为EditDefaultsOnly
,也就是说,我们基于这个C++class创建一个名为TpsCharacter_BP
的蓝图class,然后打开这个蓝图,这3个变量的值可以在这个蓝图class的细节面板中编辑,如图:
当然,通过使用 Visible*
说明符,它们是只读的(在 详细信息面板 中显示为灰色),因此您无法更改它们的值。
现在让我们回到您的 MyActorComponent
。就像我说的,Component
的说明符工作方式有些不同。
Component
与其所有者 class 一起出现在 组件面板 中,而不是 详细信息面板 就像一个非Component
变量。- 如果
Component
既没有Visible*
也没有Edit*
说明符,这个Component
本身 总是 出现在编辑器,但您无法访问此组件内的 properties/variables。,并且此Component
的 详细信息面板 将是空的。 Visible*
说明符允许您通过其 详细信息面板 访问Component
的属性,就像访问我的 [=27] 中的 3 个变量一样=] class。但是,当您将其声明为Edit*
时, 详细信息面板 将显示连线设置,允许您修改 指针值 这个Component
而不是它的内容。这绝对是你应该始终避免的一件事。
Component
的经验法则:永远不要 将它们声明为 Edit*
因为它允许您更改指向其他事物的指针值;总是做 Visible*
。对于非 Component
对象,您可以自由设置 Edit*
.
现在更容易理解 BlueprintRead*
说明符。有Visible*
是不是多此一举? BlueprintReadOnly
是否反对 Edit*
说明符?绝对没有。它们在不同的上下文中有效吗?是的。 BlueprintRead*
说明符允许您在蓝图编辑器的 事件图表 中 read/write 变量,也就是说,当您执行蓝图可视化脚本时。对于上面的 TpsCharacter
class,由于所有 3 个变量都声明为 BlueprintReadOnly
,因此我可以在 事件图 中获取它们的值,如下所示:
您可以为您的 MyActorComponent
做同样的事情。通过使用 BlueprintReadWrite
,您还可以在 Event Graph.
我写了这么长的答案来解释,因为它们虽然实际上是简单的概念,但确实会让初学者感到困惑。