Отключение Игровых Объектов (GameObjects)

Если родительский объект деактивирован, его отключение также перезаписывает опцию activeSelf у всех его дочерних элементов, то есть вся иерархия объектов, от родителя до каждого его потомка, становится неактивной. Однако этот процесс не меняет значения свойства activeSelf у дочерних элементов, они вернутся в первоначальное состояние, как только родитель будет снова активирован. Это значит, что нельзя судить, активирован ли в данный момент объект на сцене, по его свойству activeSelf . Вместо него, нужно использовать свойство activeInHierarchy, которое принимает во внимание эффект перезаписывания от родителя.
Такое перезаписывающее поведение впервые появилось в Unity 4.0. В предыдущих версиях была функция под названием SetActiveRecursively , которую можно было использовать, чтобы активировать или деактивировать потомков данного родительского объекта. Однако эта функция отличалась тем, что параметр активации каждого потомка изменялся — можно было включать или отключать всю иерархию, но потомок не имел возможности “запомнить”, в каком состоянии он был изначально. Чтобы код предыдущих версий продолжал работать, SetActiveRecursively осталась и в API к 4.0, но использовать ее не рекомендуется, функция может быть исключена из API в будущем:-
// JavaScript function DeactivateChildren(g: GameObject, a: boolean) < g.activeSelf = a; for (var child: Transform in g.transform) < DeactivateChildren(child.gameObject, a); >> // C# void DeactivateChildren(GameObject g, bool a) < g.activeSelf = a; foreach (Transform child in g.transform) < DeactivateChildren(child.gameObject, a); >>
Удалить / скрыть объект
Убрать (удалить) объект можно через функцию Destroy() .
private void OnTriggerEnter(Collider other) < // Убрать текущий объект Destroy(gameObject); // Убрать указанный объект Destroy(GameObject.Find("Cube")); // Удалить объект, которого коснулись if (other.tag == "Enemy") < Destroy(other.gameObject); >>
Через данный код можно реализовать сбор предметов или уточнижение врагов.
Также можно указать, через какое время надо удалить объект.
private void OnTriggerEnter(Collider other) < // Убрать текущий объект через 2 секунды Destroy(gameObject, 2); >
Скрыть объект
Скрыть объект можно через функцию gameObject.SetActive() .
private void OnTriggerEnter(Collider other) < // Скрыть текущий объект gameObject.SetActive(false); // Скрыть объект, которого коснулись if (other.tag == "Enemy") < other.gameObject.SetActive(false); > >
Объект просто скрывается, его можно в любой момент снова показать в игре.
При выполнении функции gameObject.SetActive() также снимется галочка активности объекта.

Обновлено: 05 февраля 2021
Комментарии
Авторизуйтесь, чтобы добавлять комментарии
Как в редакторе Unity скрыть объект на сцене, но что бы в игру он попал
Есть галка рядом с названием объекта в инспекторе — она скрывает объект в редакторе и в игру он не попадает. Как сделать что бы попадал, включать/выключать постоянно не вариант. Нашел скриншот http://answers.unity3d.com/questions/578323/hide-object-in-editor-only.html, где такое взять? Есть еще в Блендере отдельно глаз скрыть в редакторе, отдельно в рендере.
#1
20:56, 2 июля 2017
По той же ссылке есть простое решение с использованием Layers
#2
21:13, 2 июля 2017
Unity(C#) — Как скрыть объект через код?
В инспекторе можно скрывать объект (нажимая на галочку), но как можно делать то же самое, но через код? Например, наступив на триггер, включается объект, который ранее был скрыт.
Ответ:
public GameObject X; // Объявим и назовем объект X void Update()< X.SetActive(false); //скрыть объект X X.SetActive(true); //показать объект X >
Добавить комментарий Отменить ответ
Мы — Wow Games,
команда, которая разрабатывает игры, а также приложения, помогающие Вам делать свои игры. Мы поможем, если у Вас возникли проблемы, и мы всегда рады новым участникам в нашей команде. Не бойтесь задавать вопросы, мы всегда на них ответим.
| Мы в соцсетях: |
|
Всем привет!
Мы — Wow Games, команда, которая разрабатывает игры, а также приложения, помогающие Вам делать свои игры. Мы поможем, если у Вас возникли проблемы, и мы всегда рады новым участникам в нашей команде. Не бойтесь задавать вопросы, мы всегда на них ответим.