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中进行编辑,如图:
当然,通过使用Visible*
说明符,它们是只读的(在详细信息面板中显示为灰色),因此您无法更改它们的值。
现在让我们回到你的MyActorComponent
. 就像我说的,说明符的Component
工作方式有所不同。
Component
在蓝图编辑器中与其所有者类一起出现在组件面板中,而不是像非变量一样出现在细节面板中。Component
- 当您既
Visible*
没有Edit*
a 也没有说明符时Component
,它Component
本身将始终出现在编辑器中,但您无法访问此组件内的属性/变量。,并且为此的详细信息面板Component
将为空。
Visible*
说明符允许您Component
通过其Details Panel访问 的属性,就像访问我的TpsCharacter_BP
类中的 3 个变量一样。但是,当您将其声明为 时Edit*
,详细信息面板将显示有线设置,允许您修改其指针值而Component
不是其内容。这绝对是您应该始终避免的一件事。
经验法则Component
:永远不要将它们声明为,Edit*
因为它允许您更改指针值以指向其他事物;总是这样做Visible*
。对于非Component
对象,您可以自由设置Edit*
.
现在更容易理解BlueprintRead*
说明符。存在是多余的Visible*
吗?是BlueprintReadOnly
反对Edit*
说明符吗?绝对没有。它们在不同的上下文中有效吗?是的。说明符允许您在蓝图编辑器的事件图表BlueprintRead*
中读取/写入变量,也就是说,当您执行蓝图可视化脚本时。对于我上面的类,由于声明了所有 3 个变量,我可以在事件图中获取它们的值,如下所示:
TpsCharacter
BlueprintReadOnly

您可以为您的MyActorComponent
. 通过使用,您还可以在事件图表BlueprintReadWrite
中设置这些变量的值。
我写了这么长的答案来解释,因为尽管它们实际上是简单的概念,但它们确实会使初学者感到困惑。