wake-up-neo.net

Unterschied zwischen enabled, isActiveAndEnabled und activeInHierarchy in Unity

Ich kann nicht glauben, dass diese Frage nicht schon irgendwo gestellt wurde; ein ziemlich gründliches googeln hat keine ergebnisse ergeben. In der Unity-Dokumentation heißt es über das Feld Behaviour.isActiveAndEnabled :

Hat das Verhalten aktiviert aufgerufen.
Wahr, während das Verhalten aktiviert ist, falsch, wenn es deaktiviert ist.

Und es sagt dies über Behaviour.enabled :

Aktivierte Verhaltensweisen werden aktualisiert, deaktivierte Verhaltensweisen nicht.
Dies wird als kleines Kontrollkästchen im Inspektor des Verhaltens angezeigt.

In einem Artikel wird nur erläutert, was "Aktiviert" mehr bedeutet als das andere. Soweit ich das beurteilen kann, sind diese Felder unter genau den gleichen Bedingungen richtig/falsch! Was ist der Unterschied? Wann würden Sie eins übereinander verwenden? Eine Klarstellung wäre sehr dankbar!

11
Rabadash8820

isActiveAndEnabled und enabled scheinen Anfängern sehr verwirrend zu sein, und ich wette, die meisten Leute kennen immer noch nicht den Unterschied und wissen nicht, wann sie welche verwenden sollen. Ich war einer dieser Leute.

Zwei Dinge zu verstehen:

A. GameObjects können aktiviert und deaktiviert sein.

B. Skripte können aktiviert und deaktiviert sein.

Das Schlüsselwort in isActiveAndEnabled sollte alles erklären.

Was passiert mit jeder Immobilie:

1 . Für Behaviour.enabled ist dies die Wahrheitstabelle:

  • GameObject = Aktiv AND Script = Aktiviert then Behaviour.enabled = true.
  • GameObject = Aktiv AND Script = Deaktiviert then Behaviour.enabled = false.
  • GameObject = Inaktiv AND Script = Aktiviert then Behaviour.enabled = true.
  • GameObject = Inaktiv AND Script = Deaktiviert then Behaviour.enabled = false.

Es ist egal ob die GameObject, an die das Skript angehängt ist, aktiviert oder deaktiviert ist, damit Behaviour.enabledwahr zurückgibt. Was zählt ist, ob das Skript oder die Komponente, die an das GameObject angehängt ist, aktiviert oder deaktiviert ist.

2 . Für Behaviour.isActiveAndEnabled ist dies die Wahrheitstabelle:

  • GameObject = Aktiv AND Script = Aktiviert dann isActiveAndEnabled = true.
  • GameObject = Aktiv AND Script = Deaktiviert dann isActiveAndEnabled = false.
  • GameObject = Inaktiv AND Script = Aktiviert dann isActiveAndEnabled = false.
  • GameObject = Inaktiv AND Script = Deaktiviert dann isActiveAndEnabled = false.

Es ist wichtig ob GameObject aktiviert oder deaktiviert ist, damit Behaviour.isActiveAndEnabled true oder false zurückgibt. Damit Behaviour.isActiveAndEnabledtrue zurückgibt, muss both das GameObject, an das das Skript/die Komponente angehängt ist, active und das Skript enabled sein. Wenn eines davon falsch ist, gibt Behaviour.isActiveAndEnabledfalse zurück.

EDIT:

Wann möchten Sie enabled und NICHT isActiveAndEnabled erhalten?

Mit enabled können Sie prüfen, ob ein Skript aktiviert/deaktiviert ist. Sie können damit auch ein Skript aktivieren oder deaktivieren. Abhängig von Ihrer Spielelogik gibt es Zeiten, in denen Sie ein Skript deaktivieren/aktivieren. Wenn zum Beispiel ein GameObject nicht mehr auf dem Bildschirm angezeigt wird, aber ein Skript angehängt ist, das in der Funktion Update() umfangreiche Berechnungen ausführt, können Sie dieses Skript deaktivieren und später wieder aktivieren, wenn das GameObject sichtbar ist.

isActiveAndEnabled ist schreibgeschützt. Sie können es nur verwenden, um zu überprüfen, ob beide das Skript enabled ist und das GameObject an active angehängt ist. Sie können nicht verwenden, um das GameObject zu aktivieren oder zu aktivieren.

if (myScriptInstance.isActiveAndEnabled) ist eine Kurzform für if (myScriptInstance.gameObject.activeSelf && myScriptInstance.enabled), aber isActiveAndEnabled macht Ihren Code kürzer und einfacher zu lesen.

Zwischen GameObject.activeInHierarchy und Behaviour.enabled befinden sich alle Informationen, die zum Überprüfen des Status erforderlich sind.

Nicht wirklich. Dies sind sehr unterschiedliche Variablen, die Sie definitiv benötigen, wenn Sie Unity verwenden. Ich glaube nicht, dass Sie verstehen, wofür GameObject.activeInHierarchy verwendet wird. Verwenden Sie GameObject.activeSelf not GameObject.activeInHierarchy, um zu überprüfen, ob GameObject aktiv ist oder nicht. Zum Aktivieren/Deaktivieren von GameObject benutze GameObject.SetActive(true/false);

3 . GameObject.activeInHierarchy und wann man es benutzt :

In der folgenden Tabelle werden pObj = Parent GameObject und cObj = Child GameObject und diese GameObject.activeInHierarchy für das Child GameObject ausgeführt.

  • pObj = Aktiv AND cObj = Aktiv dann GameObject.activeInHierarchy = true.
  • pObj = Aktiv AND cObj = Inaktiv dann GameObject.activeInHierarchy = false.
  • pObj = Inaktiv AND cObj = Aktiv dann GameObject.activeInHierarchy = false.
  • pObj = Inaktiv AND cObj = Inaktiv dann `GameObject.activeInHierarchy = false.

GameObject.activeInHierarchy ist fast wie isActiveAndEnabled. Es hängt von zwei Dingen ab, dass es true ist. Das übergeordnete GameObject muss aktiv sein. Das GameObject (Child), für das die Prüfung durchgeführt wird, muss ebenfalls aktiv sein. Wenn eines davon falsch ist, gibt GameObject.activeInHierarchyfalse zurück.

Sie verwenden GameObject.activeInHierarchy, um zu überprüfen, ob das bereitgestellte GameObject aktiv ist, und gleichzeitig, ob auch alle übergeordneten Objekte aktiv sind. Wenn das GameObject kein übergeordnetes Objekt hat, benutze einfach GameObject.activeSelf. GameObject.activeSelf prüft nur, ob das GameObject aktiv ist oder nicht. Das übergeordnete Element wie GameObject.activeInHierarchy wird nicht überprüft.

14
Programmer

Ich weiß, dass es irreführend ist:

Behaviour.isActive And Enabled = Wurde das aktivierte Verhalten aufgerufen?.

Damit ein aktiviertes Verhalten aufgerufen werden kann, muss sein Spielobjekt aktiv sein UND das Verhalten selbst muss aktiviert sein.

Behaviour.enabled = Aktivierte Verhaltensweisen werden aktualisiert

Damit ein Verhalten aktualisiert wird, muss das Kontrollkästchen aktiviert sein. Wenn das Spielobjekt jedoch nicht aktiv ist, kann es nicht aktualisiert werden, sodass das zugehörige Verhalten nicht aktualisiert werden kann.


Also in Kürze:


Verhalten. isActiveAndEnabled: Komponente ist aktiviert & Spielobjekt ist aktiv

Verhalten. aktiviert: Komponente ist aktiviert & Spielobjekt kann aktiviert oder deaktiviert sein


GameObject. activeSelf: Spielobjekt ist aktiv

GameObject. activeInHierarchy: Spielobjekt und alle seine Eltern sind aktiv


3
Bizhan

Ich habe festgestellt, dass isActiveAndEnabled falsch ist, als das Ereignis Awake nicht aufgerufen wurde.

0
wishmaster35