温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - Difference between enabled, isActiveAndEnabled and activeInHierarchy in Unity
c# unity3d unity5

c# - Unity中enabled,isActiveAndEnabled和activeInHierarchy之间的区别

发布于 2020-05-27 12:54:05

我不敢相信这个问题尚未在某个地方问过。相当彻底的Google搜寻没有结果。Unity文档对此内容进行了说明Behaviour.isActiveAndEnabled

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

它说Behaviour.enabled

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

因此,一篇文章只是阐述了“ Enabled”比另一篇文章更有意义。据我所知,这些字段在完全相同的条件下为true / false!那么区别是什么呢?您什么时候可以使用另一个?澄清将不胜感激!

查看更多

提问者
Rabadash8820
被浏览
339
Programmer 2016-11-21 07:16

isActiveAndEnabledenabled似乎很混乱初学者和我敢打赌,大多数人仍然不知道其中的差别,以及何时使用各一个。我就是其中之一。

有两件事要理解:

一个 .GameObjects可以激活去激活

B。脚本可以启用禁用

关键字in isActiveAndEnabled应该说明了一切。

每个属性会发生什么:

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

  • GameObject = 活动 AND脚本= 启用,然后Behaviour.enabled = true。
  • GameObject = 活动 AND脚本= 禁用,然后Behaviour.enabled = false。
  • GameObject = 非活动 AND脚本= 启用,然后Behaviour.enabled = true。
  • GameObject = 无效 AND脚本= 禁用,然后Behaviour.enabled = false。

,如果此事GameObject脚本连接到被激活停用Behaviour.enabled返回重要的是是否启用或禁用了附加到GameObject的脚本或组件。

2。对于Behaviour.isActiveAndEnabled,这是真理表:

  • GameObject = 活动 AND脚本= 启用,然后isActiveAndEnabled = true。
  • GameObject = 活动 AND脚本= 禁用,然后isActiveAndEnabled = false。
  • GameObject = 无效,并且Script = Enabled,然后isActiveAndEnabled = false。
  • GameObject = 非活动 AND脚本= 禁用,然后isActiveAndEnabled = false。

重要,如果GameObject被启用或禁用的Behaviour.isActiveAndEnabled返回true或false。为了Behaviour.isActiveAndEnabled返回true必须将脚本/组件所附的GameObject 激活并且必须启用脚本如果其中任何一个为假,Behaviour.isActiveAndEnabled则将返回false

编辑

您什么时候想得到enabled而不是isActiveAndEnabled

您用于enabled检查脚本是否启用/禁用。您也可以使用它来启用或禁用脚本。根据您的游戏逻辑,有时会禁用/启用脚本。例如,当某个GameObject在屏幕上不再可见,但是您附加了一个脚本,该脚本正在Update()函数中进行大量计算时,您可以禁用已启用的脚本,并在以后可见该GameObject时重新启用它。

isActiveAndEnabled是只读的。你只能用它来检查,如果这两个剧本enabled游戏对象它是连接到active不能使用它来启用或激活GameObject。

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

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

并不是的。在使用Unity时,您肯定需要这些完全不同的变量。我认为您不了解GameObject.activeInHierarchy它的用途。要检查GameObject是否处于活动状态,请使用GameObject.activeSelfnot GameObject.activeInHierarchy要激活/停用GameObject,请使用GameObject.SetActive(true/false);

3GameObject.activeInHierarchy以及何时使用它

对于下表,pObj =父GameObjectcObj =子GameObject,并且正在对子GameObject执行GameObject.activeInHierarchy。

  • pObj = 激活 AND cObj = 激活,然后GameObject.activeInHierarchy = true。
  • pObj = 主动和cObj = 无效然后GameObject.activeInHierarchy =假。
  • pObj = 无效,而cObj = 有效,然后GameObject.activeInHierarchy = false。
  • pObj = 无效,而cObj = 无效,则` GameObject.activeInHierarchy = false。

GameObject.activeInHierarchy几乎像isActiveAndEnabled这要取决于两件事true父GameObject必须处于活动状态。被执行检查的GameObject(Child)也必须处于活动状态。如果其中任何一个为假,GameObject.activeInHierarchy则将返回false

您可以GameObject.activeInHierarchy用来检查提供的GameObject是否处于活动状态,并同时检查其所有父对象是否也处于活动状态。如果GameObject没有父对象,则只需使用GameObject.activeSelfGameObject.activeSelf只会检查GameObject是否处于活动状态。不会像那样检查父母GameObject.activeInHierarchy