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

时间:2018-08-25 11:51:46

标签: unreal-engine4 unreal-blueprint

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

UE4 source code中的文档(另请参见UE4 wikiUE4 documentation)对可编辑性说以下几点:

  • 对于VisibleAnywhereVisibleInstanceOnlyVisibleDefaultsOnly
      

    ...根本无法编辑。

  • 对于EditAnywhereEditInstanceOnlyEditDefaultsOnly
      

    ...可以编辑...

  • 对于BlueprintReadOnly

      

    ...可以被蓝图读取,但不能修改。

    BlueprintReadWrite

      

    ...可以从蓝图中读取或写入。

问题:

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

    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  2. 使用Edit*的说明符更加令人困惑,该说明符允许在蓝图中进行读写,而BlueprintReadOnly则限制在蓝图中仅进行读取。两个说明者不是互相反对吗?示例:

    UPROPERTY(EditAnywhere, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  3. Visible* / Edit*指定符在与BlueprintRead*指定符不同的上下文中有效吗? (问题不是关于InstanceOnly(实例的属性窗口),DefaultsOnly(原型的属性窗口)和Anywhere(实例和原型))

1 个答案:

答案 0 :(得分:6)

tl; dr

  • Visible* / Edit*说明符允许您(通常是游戏设计者)直接在Blueprint Editor中访问/修改变量,以快速配置类属性。
  • BlueprintRead*允许您在执行 Visual Scripting 时获取/设置事件图中变量的值。

说明:

官方文档中的某些命名和解释确实有些含糊,特别是对于初学者。简而言之,Visible* / Edit*BlueprintRead*都将类中的变量暴露给虚幻引擎,但是却做了不同的事情。实际上,问题2和3都可以通过问题1回答。让我们看一下问题1:

  

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

     

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的Blueprint类并打开此Blueprint之后,这3个变量的值可在此蓝图类的“详细信息面板” ,如图所示:Blueprint Editor snapshot for TpsCharacter_BP

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

现在让我们回到您的MyActorComponent。就像我说的那样,Component的说明符的工作方式有些不同。

  1. Component和它的所有者类一起出现在 Components Panel 中,而不像非Component出现在 Details Panel 中一样变量。
  2. 如果您既没有Visible*的{​​{1}}也没有Edit*的说明符,则此Component本身会始终出现在编辑器中,但是< strong>您无法访问该组件内的属性/变量。,并且此Component详细信息面板将为空。
  3. Component说明符允许您通过其{strong>详细信息面板访问Visible*的属性,就像访问Component类中的3个变量一样。但是,当您将其声明为TpsCharacter_BP时,详细信息面板将显示有线设置,允许您修改以下内容的 指针值 Edit*,而不是其内容。这绝对是您应该始终避免的一件事。

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

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

您可以为BlueprintReadOnly做同样的事情。通过使用MyActorComponent,您还可以在事件图中为这些变量设置值。

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