首页 > 解决方案 > 为什么 UPROPERTY 说明符 Visible*/Edit* 与 BlueprintRead* 一起使用

问题描述

虚幻引擎 4 提供了三个说明符来控制通过UPROPERTY().

UE4 源代码中的文档(另请参见UE4 wikiUE4 文档)中关于可编辑性的说明如下:

问题:

  1. 既然说明Visible*符已经在蓝图中限制为只读,为什么还要与BlueprintReadOnly? 第二个说明符不是多余的吗?例子:

    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
  2. 更令人困惑的是Edit*说明符的使用,它允许在蓝图中读取和写入,以及在蓝图BlueprintReadOnly中限制为只读。两个说明符不是相互对立的吗?例子:

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

标签: unreal-engine4unreal-blueprint

解决方案


tl;博士

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

解释:

官方文档中的一些命名和解释确实有点模棱两可,尤其是对于初学者。简而言之,Visible*/Edit*BlueprintRead*将类中的变量暴露给Unreal Engine,但做不同的事情。其实问题2和问题3都可以通过问题1来回答,我们看你的问题1:

既然说明Visible*符已经在蓝图中限制为只读,为什么还要与BlueprintReadOnly? 第二个说明符不是多余的吗?例子:

UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly) UMyActorComponent* MyActorComponent;

在这里,您将 an 暴露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,表示我们TpsCharacter_BP基于这个C++类创建一个Blueprint类调用并打开这个Blueprint后,这3个变量的值可以在这个Blueprint类的Details Panel中进行编辑,如图:TpsCharacter_BP 的蓝图编辑器快照

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

现在让我们回到你的MyActorComponent. 就像我说的,说明符的Component工作方式有所不同。

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

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

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

您可以为您的MyActorComponent. 通过使用,您还可以在事件图表BlueprintReadWrite中设置这些变量的值。

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


推荐阅读