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 是活动的
isActiveAndEnabled
和 enabled
对初学者来说似乎很混乱,我敢打赌大多数人仍然不知道它们的区别以及何时使用它们。我就是其中之一。
有两点需要理解:
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 true
,both 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
几乎等于 isActiveAndEnabled
。 true
取决于两件事。父游戏对象必须处于活动状态。正在执行检查的 GameObject(Child) 也必须处于活动状态。如果其中任何一条为假,则 GameObject.activeInHierarchy
将 return false
。
您使用 GameObject.activeInHierarchy
检查提供的 GameObject 是否处于活动状态,同时检查其所有父项是否也处于活动状态。如果 GameObject 没有父级,则只需使用 GameObject.activeSelf
。 GameObject.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 |
+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+
我不敢相信这个问题还没有在某个地方被问过;相当彻底的谷歌搜索没有结果。 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 是活动的
isActiveAndEnabled
和 enabled
对初学者来说似乎很混乱,我敢打赌大多数人仍然不知道它们的区别以及何时使用它们。我就是其中之一。
有两点需要理解:
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 true
,both script/component 附加到的 GameObject 必须 active 并且脚本必须 启用 。如果其中任何一条为假,则 Behaviour.isActiveAndEnabled
将 return false
.
编辑:
When would you want to get
enabled
and NOTisActiveAndEnabled
?
您使用 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
几乎等于 isActiveAndEnabled
。 true
取决于两件事。父游戏对象必须处于活动状态。正在执行检查的 GameObject(Child) 也必须处于活动状态。如果其中任何一条为假,则 GameObject.activeInHierarchy
将 return false
。
您使用 GameObject.activeInHierarchy
检查提供的 GameObject 是否处于活动状态,同时检查其所有父项是否也处于活动状态。如果 GameObject 没有父级,则只需使用 GameObject.activeSelf
。 GameObject.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 |
+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+