Разница между enabled, isActiveAndEnabled и activeInHierarchy в единстве

Я не могу поверить, что этот вопрос еще не был задан где-то; довольно тщательный поиск в Интернете не дал никаких результатов. В документации Unity говорится об этом Behaviour.isActiveAndEnabled

3 ответов


isActiveAndEnabled и enabled кажется очень запутанным для начинающих и я уверен, что большинство людей все еще не знают разницы и когда использовать каждый из них. Я был одним из этих людей.

две вещи понять:

A.GameObjects может быть активирован и де-активирован.

B.Скрипты могут быть включено и отключен.

ключевое слово в isActiveAndEnabled это все объясняет.

что происходит с каждым свойством:

1.Для Behaviour.enabled, Это таблица истинности:

  • GameObject = активный и Script = включено затем поведение.включенный= истинный.
  • GameObject = активный и Script = отключен затем поведение.включенный= ложный.
  • GameObject = неактивные и скрипт = включено затем поведение.включенный= истинный.
  • GameObject = неактивные и Script = отключен затем поведение.включенный= ложный.

это не дело, если GameObject скрипт прикреплен к is активирован или деактивирован на Behaviour.enabled вернуться правда. Имеет значение, включен ли скрипт или компонент, подключенный к GameObject, или нетрудоспособный.

2.Для Behaviour.isActiveAndEnabled, это таблица истинности:

  • GameObject = активный и Script = включено затем isActiveAndEnabled = истинный.
  • GameObject = активный и Script = отключен затем isActiveAndEnabled = ложный.
  • GameObject = неактивные и Script = включено затем isActiveAndEnabled = ложный.
  • GameObject = неактивные и Script = отключен затем isActiveAndEnabled = ложный.

это вопросы если GameObject включено или отключено для Behaviour.isActiveAndEnabled возвращает true или false. Для того, чтобы Behaviour.isActiveAndEnabled вернуться true, и GameObject скрипт / компонент прилагается к должен быть активный и сценарий должен быть включено. Если все это ложь, тогда Behaviour.isActiveAndEnabled вернутся false.

редактировать:

когда бы вы хотели получить enabled, а не isActiveAndEnabled?

вы используете enabled чтобы проверить, если скрипт включен/отключен. Вы также можете использовать его для включения или отключения скрипта. В зависимости от логики игры, бывают случаи, когда вы отключаете/включаете скрипт. Например, когда GameObject больше не отображается на экране, но к нему прикреплен один скрипт, который выполнение тяжелых вычислений в Update() функция, вы можете отключить этот скрипт с включенным и включить его позже, когда GameObject будет виден.

isActiveAndEnabled доступно только для чтения. Вы можете использовать его только для проверки, если и скрипт enabled и GameObject он прикреплен к active. Вы не может используйте его для включения или активации GameObject.

if (myScriptInstance.isActiveAndEnabled) это короткая рука для if (myScriptInstance.gameObject.activeSelf && myScriptInstance.enabled) но isActiveAndEnabled делает ваш код короче и легче читать.

Между GameObject.activeInHierarchy and Behaviour.включен, одно есть вся информация, необходимая для проверки состояния.

не совсем так. Это очень разные переменные, которые вам обязательно понадобятся при использовании Unity. Я не думаю, что вы понимаете, что GameObject.activeInHierarchy используется для. Чтобы проверить, активен ли GameObject, используйте GameObject.activeSelf не GameObject.activeInHierarchy. Для активации / деактивации GameObject используйте GameObject.SetActive(true/false);

3.GameObject.activeInHierarchy и когда его использовать:

в таблице pObj = Родительский GameObject и cObj = Child GameObject и этот GameObject.activeInHierarchy выполняется на дочернем GameObject.

  • pobj по = активный и cObj = активный затем GameObject.activeInHierarchy = истинный.
  • pobj по = активный и cObj = неактивные затем GameObject.activeInHierarchy = ложный.
  • pobj по = неактивные и cObj = активный затем GameObject.activeInHierarchy = ложный.
  • pobj по = неактивные и cObj = неактивные затем ' GameObject.activeInHierarchy = ложный.

GameObject.activeInHierarchy почти как isActiveAndEnabled. Это зависит от двух вещей, чтобы быть true. Родитель Объект должен быть активным. GameObject (Child), на котором выполняется проверка, также должен быть активным. Если все это ложь, то GameObject.activeInHierarchy вернутся false.

вы используете GameObject.activeInHierarchy чтобы проверить, активен ли предоставленный GameObject, и в то же время проверить, активны ли все его родители. Если у GameObject нет родителя, просто используйте GameObject.activeSelf. GameObject.activeSelf будет только проверять, активен ли GameObject или нет. Он не будет проверять родителя, как GameObject.activeInHierarchy.


Я знаю, что это вводит в заблуждение:

поведение.метод isactiveиEnabled = поведение было включено вызывается.

для того, чтобы поведение было включено, его игровой объект должен быть активным, и само поведение должно быть включено.

поведение.включено = включено поведение обновляется

для обновления поведения необходимо установить флажок. однако, если объект игры не активен, то он не может быть обновлен, поэтому его прикрепленное поведение не может быть обновлено.


короче:


поведение.isActiveAndEnabled: компонент включен & объект игры

поведение.включено: компонент включен & игровой объект может быть активен или деактивирован


GameObject.activeSelf: объект игры

GameObject.activeInHierarchy: цель игры и все ее родители активны



Я заметил, что isActiveAndEnabled имеет значение false, когда событие Awake не вызывалось.