web-dev-qa-db-fra.com

Différence entre activé, isActiveAndEnabled et activeInHierarchy dans Unity

Je ne peux pas croire que cette question n'ait pas déjà été posée quelque part; un googling assez complet n'a donné aucun résultat. La documentation de Unity dit ceci à propos du champ Behaviour.isActiveAndEnabled :

Est-ce que le comportement avait activé appelé.
Vrai lorsque le comportement est activé, faux lorsqu'il est désactivé.

Et il est dit ceci à propos de Behaviour.enabled :

Les comportements activés sont mis à jour, désactivés Les comportements ne le sont pas.
Ceci apparaît comme la petite case à cocher dans l'inspecteur du comportement.

Donc, un article précise ce que "activé" signifie plus que l'autre. Autant que je sache, ces champs sont vrais/faux dans les mêmes conditions! Alors, quelle est la difference? Quand utiliseriez-vous l'un sur l'autre? Une clarification serait très appréciée!

11
Rabadash8820

isActiveAndEnabled et enabled semble très déroutant pour les débutants et je parie que la plupart des gens ne connaissent toujours pas la différence et quand utiliser chacun d'eux. J'étais l'une de ces personnes.

Deux choses à comprendre:

A. Les GameObjects peuvent être activés et désactivés.

B. Les scripts peuvent être activé et désactivé.

Le mot clé dans isActiveAndEnabled devrait tout expliquer.

Qu'est-ce qui se passe avec chaque propriété:

1. Pour Behaviour.enabled, il s'agit de la table de vérité:

  • GameObject = Actif ET Script = Activé alors Comportement.enabled = true.
  • GameObject = Actif AND Script = Désactivé alors Behaviour.enabled = false.
  • GameObject = Inactif AND Script = Activé alors Behaviour.enabled = true.
  • GameObject = Inactif ET Script = Désactivé alors Behaviour.enabled = false.

Il n'a pasimporte si la variable GameObject à laquelle le script est attaché est activée ou désactivée pour que Behaviour.enabled renvoie vrai. Ce qui compte, c'est si le script ou le composant attaché GameObject est activé ou désactivé.

2. Pour Behaviour.isActiveAndEnabled, il s'agit de la table de vérité:

  • GameObject = Actif ET Script = Activé alors isActiveAndEnabled = true.
  • GameObject = Actif ET Script = Désactivé alors isActiveAndEnabled = false.
  • GameObject = Inactif AND Script = Enabled alors isActiveAndEnabled = false.
  • GameObject = Inactif AND Script = Disabled alors isActiveAndEnabled = false.

Importesi GameObject est activé ou désactivé par Behaviour.isActiveAndEnabled afin de renvoyer true ou false. Pour que Behaviour.isActiveAndEnabled renvoie true, les deux le GameObject auquel le script/composant est lié doit être actif et le script doit être activé. Si l'une des deux est fausse, alors Behaviour.isActiveAndEnabled renverra false.

EDIT:

Quand voudriez-vous obtenir enabled et NON isActiveAndEnabled?

Vous utilisez enabled pour vérifier si un script est activé/désactivé. Vous pouvez également l'utiliser pour activer ou désactiver un script. En fonction de la logique de votre jeu, vous pouvez parfois activer/désactiver un script. Par exemple, lorsqu'un objet GameObject n'est plus visible à l'écran mais qu'un script lui est associé qui effectue un calcul lourd dans la fonction Update(), vous pouvez désactiver ce script avec activé et le réactiver ultérieurement lorsque l'objet GameObject est visible.

isActiveAndEnabled est en lecture seule. Vous ne pouvez l'utiliser que pour vérifier si les deux le script est enabled et que GameObjectest attaché à active. Vous ne pouvez pas l'utiliser pour activer ou activer GameObject.

if (myScriptInstance.isActiveAndEnabled) est un raccourci pour if (myScriptInstance.gameObject.activeSelf && myScriptInstance.enabled) mais isActiveAndEnabled rend votre code plus court et plus facile à lire.

Entre GameObject.activeInHierarchy et Behaviour.enabled, vous disposez de toutes les informations nécessaires pour vérifier l'état.

Pas vraiment. Ce sont des variables très différentes dont vous aurez certainement besoin lors de l’utilisation de Unity. Je ne pense pas que vous compreniez à quoi sert GameObject.activeInHierarchy. Pour vérifier si GameObject est actif ou non, utilisez GameObject.activeSelf pas GameObject.activeInHierarchy. Pour activer/désactiver GameObject, utilisez GameObject.SetActive(true/false);

3.GameObject.activeInHierarchy et quand l'utiliser:

Pour le tableau ci-dessous, pObj = GameObject parent et cObj = Child GameObject et que GameObject.activeInHierarchy est en cours d'exécution sur le Child GameObject.

  • pObj = Actif AND cObj = Actif alors GameObject.activeInHierarchy = true.
  • pObj = Actif AND cObj = Inactif alors GameObject.activeInHierarchy = false.
  • pObj = Inactif ET cObj = Actif alors GameObject.activeInHierarchy = false.
  • pObj = Inactif ET cObj = Inactif alors `GameObject.activeInHierarchy = false.

GameObject.activeInHierarchy est presque comme isActiveAndEnabled. Cela dépend de deux choses pour que cela soit true. Le GameObject parent doit être actif. Le GameObject (Child) sur lequel la vérification est en cours doit également être actif. Si l'une de ces valeurs est false, alors GameObject.activeInHierarchy renverra false.

Vous utilisez GameObject.activeInHierarchy pour vérifier si le GameObject fourni est actif et en même temps pour vérifier si tous ses parents sont également actifs. Si le GameObject n'a pas de parent, utilisez simplement GameObject.activeSelf. GameObject.activeSelf vérifiera uniquement si GameObject est actif ou non. Il ne vérifiera pas le parent comme GameObject.activeInHierarchy.

14
Programmer

Je sais que c'est trompeur:

Behaviour.isActive Et Enabled = Le comportement a-t-il déjà été activé?.

Pour qu'un comportement ait activé enabled, son objet de jeu doit être actif ET le comportement lui-même doit être activé.

Behaviour.enabled = Les comportements activés sont mis à jour

Pour qu'un comportement soit mis à jour, la case à cocher doit être cochée. Cependant, si l'objet de jeu n'est pas actif, il ne peut pas être mis à jour et ses comportements attachés ne peuvent pas être mis à jour.


Donc en bref:


Comportement. isActiveAndEnabled: le composant est activé & l'objet de jeu est actif

Comportement. activé: le composant est activé & l'objet de jeu peut être actif ou désactivé


GameObject. activeSelf: - L'objet de jeu est actif

GameObject. activeInHierarchy: objet de jeu et tous ses parents sont actifs


3
Bizhan

J'ai remarqué que isActiveAndEnabled est false lorsque l'événement Awake n'a pas été appelé.

0
wishmaster35