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

Roi*_*ton 1 unreal-engine4 unreal-blueprint

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

UE4源代码中的文档(另请参阅UE4 wiki,UE4文档)说明了关于可编辑性的以下内容:

  • 对于VisibleAnywhere,VisibleInstanceOnly,VisibleDefaultsOnly:

    ...根本无法编辑.

  • 对于EditAnywhere,EditInstanceOnly,EditDefaultsOnly:

    ......可以编辑......

  • 用于BlueprintReadOnly:

    ...可以通过蓝图读取,但不能修改.

    并且BlueprintReadWrite:

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

问题:

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

    UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
    UMyActorComponent* MyActorComponent;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更令人困惑的是使用说明Edit*符,它允许在Blueprint中进行读写,同时BlueprintReadOnly限制在Blueprint中只读.两个指定者不是互相反对的吗?例:

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

小智 6

TL;博士

  • 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;
Run Code Online (Sandbox Code Playgroud)

它们都被指定为EditDefaultsOnly,这意味着,在我们创建一个TpsCharacter_BP基于此C++ 类调用的Blueprint类并打开此蓝图之后,这三个变量的值可以在此Blueprint类的Details Panel中编辑,如图所示:TpsCharacter_BP的蓝图编辑器快照

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

现在让我们回到你的身边吧MyActorComponent.就像我说的那样,Component作品的说明者有些不同.

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

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

现在理解BlueprintRead*说明符要容易得多.存在多余多余Visible*?是BlueprintReadOnly对立的Edit*指定者吗?绝对没有.它们在不同的背景下有效吗?是.该BlueprintRead*说明符允许你读/写在一个变量事件图在蓝图编辑器,也就是当你做蓝图可视化脚本.对于我TpsCharacter上面的类,由于声明了所有3个变量BlueprintReadOnly,我可以在事件图中获取它们的值,如下所示: 从事件图获取变量

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

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