Unity

时间:2016-11-20 18:50:57

标签: c# unity3d unity5

我无法相信这个问题还没有被问过;一个相当彻底的谷歌搜索没有结果。 Unity文档说明了Behaviour.isActiveAndEnabled字段:

  

是否已启用行为已启用   启用行为时为True,禁用时为false。

它说的是Behaviour.enabled

  

启用行为已更新,禁用行为不是。
  这显示为行为检查器中的小复选框。

因此,有一篇文章详细阐述了“启用”意味着什么比另一种意味着更多。据我所知,这些字段在完全相同的条件下是真/假的!那么区别是什么呢?你什么时候用一个而不是另一个?非常感谢澄清!

4 个答案:

答案 0 :(得分:14)

isActiveAndEnabledenabled似乎让初学者感到非常困惑,我打赌大多数人仍然不知道差异以及何时使用每个人。我是其中一个人。

要理解两件事:

A .GameObjects可以激活取消激活

B 。脚本可以启用禁用

isActiveAndEnabled中的关键字应该解释一切。

每个属性会发生什么:

1 。对于Behaviour.enabled,这是真值表:

  • GameObject = Active AND Script = 已启用然后Behaviour.enabled = 真。
  • GameObject = Active AND Script = 已禁用然后Behaviour.enabled = 假的。
  • GameObject = 无效 AND Script = 已启用然后是Behaviour.enabled = 真。
  • GameObject = 无效 AND Script = 已禁用然后是Behaviour.enabled = 假的。
如果附加GameObject脚本已激活已停用 {{}> 不重要1}}返回 true 。重要的是,如果启用或禁用了附加到GameObject的脚本或组件。

2 。对于Behaviour.enabled,这是真值表:

  • GameObject = Active AND Script = 已启用然后isActiveAndEnabled = 真。
  • GameObject = Active AND Script = 已禁用然后isActiveAndEnabled = 假的。
  • GameObject = 无效 AND Script = 已启用然后isActiveAndEnabled = 假的。
  • GameObject = 无效 AND Script = 已禁用然后isActiveAndEnabled = 假的。
如果Behaviour.isActiveAndEnabled启用或禁用GameObject以返回true或false,则 重要。要使Behaviour.isActiveAndEnabled返回Behaviour.isActiveAndEnabled两者脚本/组件所附加的GameObject必须活动且脚本必须为启用。如果其中任何一项为假,则true将返回Behaviour.isActiveAndEnabled

修改

  

您希望何时获得false而不是enabled

使用isActiveAndEnabled检查脚本是否启用/禁用。您还可以使用它来启用或禁用脚本。根据您的游戏逻辑,有时您可以禁用/启用脚本。例如,当一个GameObject在屏幕上不再可见但你有一个脚本附加在enabled函数中进行大量计算时,你可以在启用时禁用该脚本,并在GameObject稍后再启用它是可见的。

Update()是只读的。您只能使用它来检查两者脚本是否为isActiveAndEnabled,而 GameObject 是否附加到enabled。您无法使用它来启用或激活GameObject。

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

  

在GameObject.activeInHierarchy和Behaviour.enabled之间,有一个   需要检查状态的所有信息。

不是真的。这些是使用Unity时肯定需要的非常不同的变量。我不认为您了解isActiveAndEnabled的用途。要检查GameObject是否处于活动状态,请使用GameObject.activeInHierarchy而不是GameObject.activeSelf。要激活/停用GameObject,请使用GameObject.activeInHierarchy

3 GameObject.activeInHierarchy以及何时使用

对于下表, pObj = Parent GameObject cObj = Child GameObject ,并且正在对Child GameObject执行GameObject.activeInHierarchy。

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

GameObject.SetActive(true/false);几乎就像GameObject.activeInHierarchy。它取决于两件事isActiveAndEnabled。父GameObject必须处于活动状态。正在执行检查的GameObject(Child)也必须处于活动状态。如果其中任何一项为假,则true将返回GameObject.activeInHierarchy

您使用false检查提供的GameObject是否处于活动状态,同时检查其所有父项是否也处于活动状态。如果GameObject没有父级,则只需使用GameObject.activeInHierarchyGameObject.activeSelf仅检查GameObject是否处于活动状态。它不会像GameObject.activeSelf那样检查父级。

答案 1 :(得分:3)

我知道这是误导性的:

  

Behaviour.isActive 已启用=已启用行为已启用。

为了激活已启用的行为,其游戏对象必须处于活动状态且必须启用行为本身。

  

Behaviour.enabled =已启用行为已更新

要更新行为,必须选中该复选框。但是,如果游戏对象没有激活,则无法更新,因此无法更新其附加行为。

简而言之:

行为。 isActiveAndEnabled: 组件已启用& 游戏对象有效

行为。启用: 组件已启用& 游戏对象可能处于有效状态或已停用

GameObject。 activeSelf: 游戏对象处于有效状态

GameObject。 activeInHierarchy: 游戏对象及其所有父级处于活动状态

答案 2 :(得分:1)

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

+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+
| 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                        |
+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+

答案 3 :(得分:0)

我注意到,当没有调用Awake事件时,isActiveAndEnabled为false。