gpt4 book ai didi

unreal-engine4 - 为什么 UPROPERTY 说明符 Visible*/Edit* 与 BlueprintRead* 一起使用

转载 作者:行者123 更新时间:2023-12-03 18:37:35 25 4
gpt4 key购买 nike

虚幻引擎 4 提供了三个说明符来控制通过 UPROPERTY() 暴露给蓝图的 C++ 类成员的可见性和可编辑性。

UE4 source code 中的文档(另见 UE4 wikiUE4 documentation )对可编辑性做了以下说明:

  • 对于 VisibleAnywhereVisibleInstanceOnlyVisibleDefaultsOnly :

    ... cannot be edited at all.

  • 对于 EditAnywhereEditInstanceOnlyEditDefaultsOnly :

    ... 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* 说明符的使用,它允许 在蓝图中读取和写入 ,以及 BlueprintReadOnly 限制在蓝图中读取。两个说明符不是相互对立的吗?例子:
    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
  • Visible*/Edit* 说明符是否在与 BlueprintRead* 说明符不同的上下文中有效? (问题不是关于 InstanceOnly(实例的属性窗口)、DefaultsOnly(原型(prototype)的属性窗口)和 Anywhere(实例和原型(prototype)))
  • 最佳答案

    tl; 博士

  • Visible*/Edit* 说明符允许您(通常是游戏设计师)直接在蓝图编辑器中访问/修改变量以快速配置类属性。
  • BlueprintRead* 允许您在执行可视化脚本时获取/设置 事件图 中变量的值。


  • 解释:

    官方文档中的一些命名和解释确实有些含糊不清,尤其是对于初学者来说。简而言之, Visible*/ Edit*BlueprintRead* 都将类中的变量暴露给 虚幻引擎 ,但做不同的事情。事实上,问题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 的说明符“似乎”与非 Component 变量的工作方式不同。

    假设我有一个用于第三人称射击游戏角色的 TpsCharacter 类,它具有以下 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++ 类创建一个名为 TpsCharacter_BP 的蓝图类并打开这个蓝图后,这三个变量的值在这个蓝图类的 细节面板 中是可编辑的,如如图所示:

    当然,通过使用 Visible* 说明符,它们是只读的(在 详细信息面板 中显示为灰色),因此您无法更改它们的值。

    现在让我们回到您的 MyActorComponent 。就像我说的, Component 的说明符的工作方式有些不同。
  • Component 与其所有者类一起出现在 组件面板 中,而不是像非 Component 变量一样出现在 详细信息面板 中。
  • 如果 Visible* 既没有 Edit* 也没有 Component 说明符,则此 Component 本身将 始终 出现在编辑器中,但 您无法访问此组件内的属性/变量。此 Component 详细信息面板 将为空。
  • Visible* 说明符允许您通过其 详细信息面板 访问 Component 的属性,就像访问我的 TpsCharacter_BP 类中的 3 个变量一样。但是,当您将其声明为 Edit* 时, 详细信息面板 将显示有线设置,允许您修改此 Component 指针值 而不是其内容。这绝对是你应该 总是 避免的一件事。

  • Component 的经验法则: 永远不要将 声明为 Edit* 因为它允许您更改指针值以指向其他事物;总是做 Visible* 。对于非 Component 对象,您可以自由设置 Edit*

    现在更容易理解 BlueprintRead* 说明符。 Visible* 的存在是多余的吗? BlueprintReadOnly 是否与 Edit* 说明符相对?绝对没有。它们在不同的上下文中是否有效?是的。 BlueprintRead* 说明符允许您在蓝图编辑器中的 事件图表 中读取/写入变量,即在您执行蓝图可视化脚本时。对于上面的 TpsCharacter 类,由于所有 3 个变量都声明为 BlueprintReadOnly ,因此我可以在 事件图 中获取它们的值,如下所示:

    您可以对 MyActorComponent 执行相同操作。通过使用 BlueprintReadWrite ,您还可以在 事件图 中设置这些变量的值。

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

    关于unreal-engine4 - 为什么 UPROPERTY 说明符 Visible*/Edit* 与 BlueprintRead* 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52017047/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com