为什么 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) 中的文档说明了以下关于可编辑性的内容:

问题:

  1. 由于 Visible* 说明符已经将使用限制为 只读 在蓝图中,为什么它与 BlueprintReadOnly 一起使用?第二个说明符不是多余的吗?示例:

    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  2. 更令人困惑的是 Edit* 说明符的用法,它允许 read 和 write 在 Blueprint 中,连同 BlueprintReadOnly which在蓝图中限制为只读。两个说明符不是 对立 吗?示例:

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  3. 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 的说明符工作方式有些不同。

  1. Component 与其所有者 class 一起出现在 组件面板 中,而不是 详细信息面板 就像一个非 Component 变量。
  2. 如果 Component 既没有 Visible* 也没有 Edit* 说明符,这个 Component 本身 总是 出现在编辑器,但您无法访问此组件内的 properties/variables。,并且此 Component 详细信息面板 将是空的。
  3. 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.

中设置这些变量的值

我写了这么长的答案来解释,因为它们虽然实际上是简单的概念,但确实会让初学者感到困惑。