虚幻引擎4提供了三个说明符,用于控制通过UPROPERTY()
暴露给蓝图的C ++类成员的可见性和可编辑性。
UE4 source code中的文档(另请参见UE4 wiki,UE4 documentation)对可编辑性说以下几点:
VisibleAnywhere
,VisibleInstanceOnly
,VisibleDefaultsOnly
:
...根本无法编辑。
EditAnywhere
,EditInstanceOnly
,EditDefaultsOnly
:
...可以编辑...
对于BlueprintReadOnly
:
...可以被蓝图读取,但不能修改。
和BlueprintReadWrite
:
...可以从蓝图中读取或写入。
问题:
由于在蓝图中Visible*
的说明符已经将用法限制为只读,为什么将其与BlueprintReadOnly
结合使用?第二个指定符不是多余的吗?示例:
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly)
UMyActorComponent* MyActorComponent;
使用Edit*
的说明符更加令人困惑,该说明符允许在蓝图中进行读写,而BlueprintReadOnly
则限制在蓝图中仅进行读取。两个说明者不是互相反对吗?示例:
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UMyActorComponent* MyActorComponent;
Visible*
/ Edit*
指定符在与BlueprintRead*
指定符不同的上下文中有效吗? (问题不是关于InstanceOnly
(实例的属性窗口),DefaultsOnly
(原型的属性窗口)和Anywhere
(实例和原型))答案 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个变量的值可在此蓝图类的“详细信息面板” ,如图所示:
当然,通过使用Visible*
说明符,它们是只读的(在 Details Panel(详细信息面板)中显示为灰色),因此您不能更改其值。
现在让我们回到您的MyActorComponent
。就像我说的那样,Component
的说明符的工作方式有些不同。
Component
和它的所有者类一起出现在 Components Panel 中,而不像非Component
出现在 Details Panel 中一样变量。 Visible*
的{{1}}也没有Edit*
的说明符,则此Component
本身会始终出现在编辑器中,但是< strong>您无法访问该组件内的属性/变量。,并且此Component
的详细信息面板将为空。Component
说明符允许您通过其{strong>详细信息面板访问Visible*
的属性,就像访问Component
类中的3个变量一样。但是,当您将其声明为TpsCharacter_BP
时,详细信息面板将显示有线设置,允许您修改以下内容的 指针值 Edit*
,而不是其内容。这绝对是您应该始终避免的一件事。 Component
的经验法则:从不将它们声明为Component
,因为它允许您更改指针值以指向其他内容;总是做Edit*
。对于非Visible*
对象,您可以自由设置Component
。
现在,更容易理解Edit*
说明符。在BlueprintRead*
的存在下多余吗? Visible*
是否与BlueprintReadOnly
指定符相对?绝对没有。它们在不同的上下文中有效吗?是。 Edit*
说明符允许您在蓝图编辑器的事件图中(即,当您执行蓝图可视化脚本时)读/写变量。对于上面的BlueprintRead*
类,由于所有3个变量都声明为TpsCharacter
,因此可以在 Event Graph (事件图)中获取它们的值,如下所示:
您可以为BlueprintReadOnly
做同样的事情。通过使用MyActorComponent
,您还可以在事件图中为这些变量设置值。
我写了这么长的答案来解释,因为尽管它们实际上是简单的概念,但它们确实会使初学者感到困惑。