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

Rab*_*820 14 c# unity-game-engine unity5

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

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

它说的是Behaviour.enabled:

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

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

Pro*_*mer 16

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

要理解的两件事:

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

B.可以启用禁用脚本.

关键字in isActiveAndEnabled应解释一切.

每个属性会发生什么:

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

  • GameObject = Active AND Script = Enabled然后Behaviour.enabled = true.
  • GameObject = Active AND Script = Disabled然后Behaviour.enabled = false.
  • GameObject = Inactive AND Script = Enabled然后Behaviour.enabled = true.
  • GameObject = Inactive AND Script = Disabled然后Behaviour.enabled = false.

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

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

  • GameObject = Active AND Script = Enabled然后isActiveAndEnabled = true.
  • GameObject = Active AND Script = Disabled然后isActiveAndEnabled = false.
  • GameObject = Inactive AND Script = Enabled然后isActiveAndEnabled = false.
  • GameObject = Inactive AND Script = Disabled然后isActiveAndEnabled = false.

重要,如果GameObject被启用或禁用的Behaviour.isActiveAndEnabled返回true或false.为了Behaviour.isActiveAndEnabled返回true,这两个游戏对象的脚本/组分附着必须是活性和脚本必须被启用.如果其中任何一个是假的,那么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);

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

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

  • pObj = Active AND cObj = Active然后GameObject.activeInHierarchy = true.
  • pObj = Active AND cObj = Inactive然后GameObject.activeInHierarchy = false.
  • pObj = 非活动 AND cObj = 活动然后GameObject.activeInHierarchy = false.
  • pObj = Inactive AND cObj = Inactive然后` GameObject.activeInHierarchy = false.

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

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


Biz*_*han 6

我知道这是误导:

GameObject.active Self = 游戏对象是否处于活动状态,而不管其父对象如何

我们期望游戏对象在其整个层次结构处于活动状态时也处于活动状态。但是activeSelf告诉我们该特定游戏对象是否处于活动状态,并忽略父母的活动状态。

GameObject.active InHierarchy =是游戏对象(及其所有的父母)实际上有活性,因此更新


Behaviour.isActive And Enabled = 是否调用了行为已启用。

为了使一个行为被调用,它的游戏对象(和它的所有父对象)必须是活动的,并且行为本身必须被启用。

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

为了更新行为,必须选中复选框。但是,如果游戏对象(或其父对象之一)不活动,则无法更新它,因此无法更新其附加行为。


简而言之:


行为。isActiveAndEnabled: 组件已启用且游戏对象层次结构处于活动状态

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


游戏对象。activeSelf: 游戏对象处于活动状态,其父母可能不

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