Страница 1 из 1

Программно отключить активность дочернего объекта [РЕШЕНО]

СообщениеДобавлено: 10 окт 2011, 08:43
Андрей
Здравствуйте. Прощу помощи.
У меня есть иерархия вложенных объектов в сцене. Мне нужно программно отключить активность только третьего в этом примере.

Изображение

Этот код1 не работает.
Синтаксис:
Используется csharp
//....
var  obj3 = GameObject.Find("GameObject3");
obj3.active = false;
//...


Этот код2 работает.
Синтаксис:
Используется csharp
//....
var  obj1 = GameObject.Find("GameObject1");
obj1.active = false;
//...


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

Re: Программно отключить активность дочернего объекта

СообщениеДобавлено: 10 окт 2011, 09:05
Neodrop
Не важно третий он или двадцать пятый. В вашем коде важны только две вещи :
[V] Правильное написание имени объекта.
[V] Имя объекта должно быть уникально и не повторяться в сцене иначе, как двиг разберётся, какой из 5-10 "GameObject3" вы ищите?

Re: Программно отключить активность дочернего объекта

СообщениеДобавлено: 10 окт 2011, 09:08
Neodrop
Ах, да - ещё пунктик. Объект то вложенный. Значит нужно описать всю его иерархию :
Find("/GameObject1/GameObject2/GameObject3")

http://unity3d.com/support/documentatio ... .Find.html

Но вообще-то, это чуть ли не самый медленный метод на свете. Лучше ищите по тагу, если уж вообще искать приспичило.

Re: Программно отключить активность дочернего объекта

СообщениеДобавлено: 10 окт 2011, 09:45
Order
Лучше заранее найти в старте и пользоваться готовыми ссылками на ГО.

Re: Программно отключить активность дочернего объекта

СообщениеДобавлено: 10 окт 2011, 09:55
seaman
Если скрипт висит на GameObject1, то правильнее использовать Transform.Find Он ищет только среди детей, что, естественно, быстрее.

Re: Программно отключить активность дочернего объекта

СообщениеДобавлено: 10 окт 2011, 10:58
Андрей
Спасибо всем за ответы. Сделал для себя вывод - внимательно читать справку Unity3D, каждую фразу.

GameObject.Find
static function Find (name : String) : GameObject
Description

Finds a game object by name and returns it.

If no game object with name can be found, null is returned. If name contains a '/' character it will traverse the hierarchy like a path name. This function only returns active gameobjects.


Я не обратил внимание, что функция возвращает только активные объекты.. Получается, что если объект неактивный, то я получу null на выходе используя GameObject.Find.

Про вариант поиска с шаблоном "/../../.../" я знал, но у меня он отказывался работать по причине выше и я этот вариант забраковал и забыл написать, что я им пользовался. А ведь я им пользовался.

Я остановился на варианте назначить тег дочернему объекту и искать объект по этому тегу и имени. Кстати с тегами так же ситуация, объект должен быть изначально активным.

Спасибо, что меня ткнули носом и не поленились.

Re: Программно отключить активность дочернего объекта [РЕШЕНО]

СообщениеДобавлено: 10 окт 2011, 12:49
burlak
Эта система из 3-х объектов представляет собой единое целое? Какой объект отвечает за отключение третьего объекта?

Если это система, думаю правильнее всего создать скрипт для объекта верхнего (или последующего) уровня в котором явно указать нужный объект, ну и отключать/включать соответственно по прямой ссылке.