web-dev-qa-db-ja.com

Unityでのenabled、isActiveAndEnabled、activeInHierarchyの違い

この質問がまだどこかで行われていないとは信じられません。かなり完全なグーグルは結果を出していない。 Unityのドキュメントには Behaviour.isActiveAndEnabled フィールド:

動作が有効になっていたか。
動作が有効な場合はtrue、無効な場合はfalse。

そして、これは Behaviour.enabled

有効な動作は更新されますが、無効な動作は更新されません。
これは、動作のインスペクターで小さなチェックボックスとして表示されます。

したがって、1つの記事では、「有効」の意味が他の記事よりも詳しく説明されています。私の知る限り、これらのフィールドはまったく同じ条件下でtrue/falseです。違いは何ですか?いつどちらを使用しますか?明確化をいただければ幸いです!

15
Rabadash8820

isActiveAndEnabledenabledは初心者には非常に混乱しているようで、ほとんどの人はまだ違いがわからないので、それぞれをいつ使用するかわかりません。私もその一人でした。

理解しておくべき2つのこと:

[〜#〜] a [〜#〜]。GameObjectsはアクティブ化できますおよびde-activated

[〜#〜] b [〜#〜]。スクリプトはを有効にできますおよびdisabled

isActiveAndEnabledのキーワードですべてを説明できます。

各プロパティで何が起こるか:

1。_Behaviour.enabled_の場合、これは真理値表です。

  • GameObject =ActiveAND Script =Enabled次にBehaviour.enabled = true。
  • GameObject =ActiveAND Script =Disabled次にBehaviour.enabled = false。
  • GameObject =InactiveAND Script =Enabled次にBehaviour.enabled = true。
  • GameObject =InactiveAND Script =Disabled次にBehaviour.enabled = false。

しないスクリプトがアタッチされているGameObjectactivatedまたはdeactivated_Behaviour.enabled_がtrueを返す重要なのは、GameObjectにアタッチされているスクリプトまたはコンポーネントが有効か無効かです。

2 ._Behaviour.isActiveAndEnabled_の場合、これは真理値表です。

  • GameObject =ActiveAND Script =Enabled次にisActiveAndEnabled = trueです。
  • GameObject =ActiveAND Script =Disabled次にisActiveAndEnabled = false。
  • GameObject =InactiveAND Script =Enabled次にisActiveAndEnabled = false。
  • GameObject =InactiveAND Script =Disabled次にisActiveAndEnabled = false。

matters _Behaviour.isActiveAndEnabled_がGameObjectを有効または無効にして、trueまたはfalseを返す場合。 _Behaviour.isActiveAndEnabled_がtrueを返すためには、bothスクリプト/コンポーネントがアタッチされているGameObjectがactiveおよびスクリプトがenabledである必要があります。これのいずれかがfalseの場合、_Behaviour.isActiveAndEnabled_はfalseを返します。

[〜#〜]編集[〜#〜]

enabledを取得し、isActiveAndEnabledを取得しない場合はいつですか?

enabledを使用して、スクリプトが有効/無効になっているかどうかを確認します。これを使用して、スクリプトを有効または無効にすることもできます。ゲームのロジックによっては、スクリプトを無効または有効にする場合があります。たとえば、GameObjectが画面に表示されなくなったが、Update()関数で重い計算を実行しているスクリプトが1つアタッチされている場合、スクリプトを有効にして無効にし、後で有効にすることができます。 GameObjectが表示されます。

isActiveAndEnabledは読み取り専用です。 bothスクリプトがenabledであり、GameObjectが添付されているかどうかを確認するためにのみ使用できますactive。あなたはできませんそれを使用してゲームオブジェクトを有効またはアクティブにします。

if (myScriptInstance.isActiveAndEnabled)if (myScriptInstance.gameObject.activeSelf && myScriptInstance.enabled)の省略形ですが、isActiveAndEnabledはコードを短くして読みやすくします。

GameObject.activeInHierarchyとBehaviour.enabledの間には、状態をチェックするために必要なすべての情報があります。

あんまり。これらは、Unityを使用するときに必ず必要となる非常に異なる変数です。 _GameObject.activeInHierarchy_の用途が理解できないと思います。 GameObjectがアクティブかどうかを確認するには、_GameObject.activeSelf_ではなく_GameObject.activeInHierarchy_を使用します。 GameObjectをアクティブ化/非アクティブ化するには、GameObject.SetActive(true/false);を使用します

.GameObject.activeInHierarchyとそれをいつ使用するか

以下の表の場合、pObj =親GameObjectおよびcObj =子GameObjectそして、そのGameObject.activeInHierarchyが子ゲームオブジェクトで実行されています。

  • pObj =ActiveAND cObj =Activethen GameObject.activeInHierarchy = true。
  • pObj =ActiveAND cObj =Inactivethen GameObject.activeInHierarchy = false.
  • pObj =InactiveAND cObj =Activethen GameObject.activeInHierarchy = false.
  • pObj =InactiveAND cObj =Inactivethen `GameObject.activeInHierarchy = false 。

_GameObject.activeInHierarchy_はisActiveAndEnabledとほとんど同じです。それがtrueであるかどうかは、2つの要因に依存します。親GameObjectがアクティブでなければなりません。チェックが実行されているGameObject(Child)もアクティブでなければなりません。これのいずれかがfalseの場合、_GameObject.activeInHierarchy_はfalseを返します。

_GameObject.activeInHierarchy_を使用して、提供されたGameObjectがアクティブかどうかを確認し、同時にすべての親がアクティブかどうかを確認します。 GameObjectに親がない場合は、単に_GameObject.activeSelf_を使用します。 _GameObject.activeSelf_は、GameObjectがアクティブかどうかのみをチェックします。 _GameObject.activeInHierarchy_のように親をチェックしません。

15
Programmer

私はそれが誤解を招くものであることを知っています:

Behaviour.isActive And Enabled = Behaviorは有効にされていましたか。

ビヘイビアーを有効にするには、そのゲームオブジェクトがアクティブで、かつビヘイビアー自体が有効になっている必要があります。

Behaviour.enabled =有効な動作が更新されます

動作を更新するには、チェックボックスをオンにする必要があります。ただし、ゲームオブジェクトがアクティブでない場合は更新できないため、アタッチされた動作を更新できません。


要するに:


動作.isActiveAndEnabled:コンポーネントが有効になっている&ゲームオブジェクトがアクティブ

動作.有効:コンポーネントが有効になっている&ゲームオブジェクトがアクティブまたは非アクティブになっている可能性がある


GameObject .activeSelf:ゲームオブジェクトがアクティブです

GameObject .activeInHierarchy:ゲームオブジェクトおよびそのすべての親はアクティブです


4
Bizhan

他の回答に加えて、IsActiveAndEnabledは、GameObjectがアクティブである(activeSelfなど)だけでなく、その階層でGameObjectがアクティブである(IsActiveInHierarchyなど)かどうかを確認するようです。これは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                        |
+-------------------+-----------------------+------------------------------+------------------------------+------------------------------+
1
murgo

Awakeイベントが呼び出されなかったときにisActiveAndEnabledがfalseであることに気付きました。

0
Deni35