Unity 中 enabled、isActiveAndEnabled 和 activeInHierarchy 之间的区别

Difference between enabled, isActiveAndEnabled and activeInHierarchy in Unity

我不敢相信这个问题还没有在某个地方被问过;相当彻底的谷歌搜索没有结果。 Unity 文档是这样描述 Behaviour.isActiveAndEnabled 字段的:

Has the Behaviour had enabled called.
True while the behaviour is enabled, false when disabled.

关于 Behaviour.enabled 是这样说的:

Enabled Behaviours are Updated, disabled Behaviours are not.
This is shown as the small checkbox in the inspector of the behaviour.

所以一篇文章只是详细阐述了 "Enabled" 比另一篇文章更重要的含义。据我所知,这些字段在完全相同的条件下 true/false!那么区别是什么呢?你什么时候会用一个而不是另一个?非常感谢您的澄清!

我知道这是误导:

GameObject.activeSelf = Is the game object active regardless of its parents

我们希望游戏 object 在其整个层次结构处于活动状态时处于活动状态。但是 activeSelf 告诉我们该特定游戏 object 是否处于活动状态,并忽略了 parents.

的活动状态

GameObject.activeInHierarchy = Is the game object (and all its parents) actually active and therefore updating


Behaviour.isActiveAndEnabled = Has the Behaviour had enabled called.

为了启用调用的行为,其游戏 object(及其所有 parents)必须处于活动状态并且必须启用行为本身。

Behaviour.enabled = Enabled Behaviours are Updated

为了更新行为,必须选中该复选框。但是,如果游戏 object(或其其中之一 parents)未激活,则无法更新它,因此无法更新其附加行为。


简而言之:


Behaviour.isActiveAndEnabled: 组件已启用 & 游戏 object 层次结构已激活

行为。已启用: 组件已启用且游戏object层次结构可能处于活动状态或已停用


GameObject.activeSelf: 游戏object处于活动状态,其parents可能不

GameObject.activeInHierarchy: game object 及其所有 parents 是活动的


isActiveAndEnabledenabled 对初学者来说似乎很混乱,我敢打赌大多数人仍然不知道它们的区别以及何时使用它们。我就是其中之一。

有两点需要理解:

A.GameObjects 可以激活取消激活.

B。脚本可以启用禁用

isActiveAndEnabled中的关键字应该可以说明一切。

每个 属性 会发生什么:

1.对于Behaviour.enabled来说,就是这个道理table:

  • GameObject = Active AND Script = Enabled 然后 Behaviour.enabled = 是的。
  • GameObject = Active AND Script = Disabled 然后 Behaviour.enabled = 假的。
  • GameObject = Inactive AND Script = Enabled 然后 Behaviour.enabled = 是的。
  • GameObject = Inactive AND Script = Disabled 然后 Behaviour.enabled = 假的。

脚本所附加的 GameObject 激活的 还是 无关紧要为 Behaviour.enabled 停用 至 return true。重要的是附加到游戏对象的脚本或组件是启用还是禁用。

2.对于Behaviour.isActiveAndEnabled来说,就是这个道理table:

  • GameObject = Active AND Script = Enabled then isActiveAndEnabled = 是的。
  • GameObject = Active AND Script = Disabled then isActiveAndEnabled = 假的。
  • GameObject = Inactive AND Script = Enabled then isActiveAndEnabled = 假的。
  • GameObject = Inactive AND Script = Disabled then isActiveAndEnabled = 假的。

重要 是否启用或禁用 [​​=14=] 到 Behaviour.isActiveAndEnabled 到 return true 或 false。为了 Behaviour.isActiveAndEnabled 到 return trueboth script/component 附加到的 GameObject 必须 active 并且脚本必须 启用 。如果其中任何一条为假,则 Behaviour.isActiveAndEnabled 将 return false.

编辑:

When would you want to get enabled and NOT isActiveAndEnabled?

您使用 enabled 检查脚本是否为 enable/disabled。您还可以使用它来启用或禁用脚本。根据您的游戏逻辑,有时您 disable/enable 脚本。例如,当一个游戏对象在屏幕上不再可见,但你附加了一个脚本,该脚本在 Update() 函数中进行大量计算时,你可以禁用该脚本并在游戏对象出现时重新启用它可见。

isActiveAndEnabled 是只读的。您只能使用它来检查 脚本是否是 enabled 以及 GameObject 它是否附加到 active。您不能使用它来启用或激活游戏对象。

if (myScriptInstance.isActiveAndEnabled)if (myScriptInstance.gameObject.activeSelf && myScriptInstance.enabled) 的缩写,但 isActiveAndEnabled 使您的代码更短且更易于阅读。

Between GameObject.activeInHierarchy and Behaviour.enabled, one has all the information one needs to check state.

不是真的。这些是您在使用 Unity 时肯定需要的非常不同的变量。我认为您不了解 GameObject.activeInHierarchy 的用途。要检查 GameObject 是否处于活动状态,请使用 GameObject.activeSelf 而不是 GameObject.activeInHierarchy。 activate/deactivate GameObject 使用 GameObject.SetActive(true/false);

3.GameObject.activeInHierarchy以及何时使用它:

对于下面的table,pObj = Parent GameObject and cObj = Child GameObject and that GameObject.activeInHierarchy正在子游戏对象上执行。

  • pObj = Active AND cObj = Active 然后 GameObject.activeInHierarchy = 是的。
  • pObj = 活动 AND cObj = 不活动 然后 GameObject.activeInHierarchy = 假的。
  • pObj = 无效 AND cObj = 有效 然后 GameObject.activeInHierarchy = 假的。
  • pObj = Inactive AND cObj = Inactive 然后`GameObject.activeInHierarchy = 假的。

GameObject.activeInHierarchy 几乎等于 isActiveAndEnabledtrue 取决于两件事。父游戏对象必须处于活动状态。正在执行检查的 GameObject(Child) 也必须处于活动状态。如果其中任何一条为假,则 GameObject.activeInHierarchy 将 return false

您使用 GameObject.activeInHierarchy 检查提供的 GameObject 是否处于活动状态,同时检查其所有父项是否也处于活动状态。如果 GameObject 没有父级,则只需使用 GameObject.activeSelfGameObject.activeSelf 只会检查游戏对象是否处于活动状态。它不会像 GameObject.activeInHierarchy.

这样检查父级

我注意到在未调用 Awake 事件时 isActiveAndEnabled 为 false。

除了其他答案外,IsActiveAndEnabled 似乎会检查 GameObject 在其层次结构中是否处于活动状态(如 IsActiveInHierarchy),而不仅仅是该 GameObject 是否处于活动状态(如 activeSelf)。这没有写在 Unity 文档中。以下是所有州的真相table。

+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+
| Component.enabled | GameObject.activeSelf | Parent GameObject.activeSelf | GameObject ActiveInHierarchy | Component isActiveAndEnabled |
+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+
| TRUE              | TRUE                  | TRUE                         | TRUE                         | TRUE                         |
| FALSE             | TRUE                  | TRUE                         | TRUE                         | FALSE                        |
| TRUE              | FALSE                 | TRUE                         | FALSE                        | FALSE                        |
| FALSE             | FALSE                 | TRUE                         | FALSE                        | FALSE                        |
| TRUE              | TRUE                  | FALSE                        | FALSE                        | FALSE                        |
| FALSE             | TRUE                  | FALSE                        | FALSE                        | FALSE                        |
| TRUE              | FALSE                 | FALSE                        | FALSE                        | FALSE                        |
| FALSE             | FALSE                 | FALSE                        | FALSE                        | FALSE                        |
+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+