Как обратиться?.. [РЕШЕНО]

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как обратиться?.. [РЕШЕНО]

Сообщение denri11 01 авг 2012, 23:52

Как обратиться к дочернему объекту и как обратиться к родительскому объекту, не используя имен (не Find'ом)? И с разной глубиной иерархии.
Последний раз редактировалось denri11 16 авг 2012, 15:09, всего редактировалось 3 раз(а).
denri11
UNец
 
Сообщения: 32
Зарегистрирован: 31 июл 2012, 20:40

Re: Как обратиться?..

Сообщение DbIMok 02 авг 2012, 00:58

вверх transform.parent.parent или transform.root вниз все не так однозначно, поэтому foreach (Transform child in transform) { ... break; }
в общем все ответы в справке по Transform
Скрытый текст:



правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как обратиться?..

Сообщение denri11 16 авг 2012, 14:54

Через transform.parent.parent или transform.root я получаю Transform родителя, а как получить GameObject родителя?
denri11
UNец
 
Сообщения: 32
Зарегистрирован: 31 июл 2012, 20:40

Re: Как обратиться?..

Сообщение DokSergey 16 авг 2012, 14:58

Синтаксис:
Используется csharp
foreach (var ob in Parent.GetComponentsInChildren<Transform>())
                child = ob.gameObject;
 
Аватара пользователя
DokSergey
UNец
 
Сообщения: 23
Зарегистрирован: 15 авг 2012, 09:17

Re: Как обратиться?..

Сообщение DokSergey 16 авг 2012, 15:04

denri11 писал(а):Через transform.parent.parent или transform.root я получаю Transform родителя, а как получить GameObject родителя?

Ну а GameObject родителя - ttransform.root.gameObject
Аватара пользователя
DokSergey
UNец
 
Сообщения: 23
Зарегистрирован: 15 авг 2012, 09:17

Re: Как обратиться?.. [РЕШЕНО]

Сообщение seaman 16 авг 2012, 17:55

transform.root.gameObject

выдаст объект корня, а не родителя
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как обратиться?.. [РЕШЕНО]

Сообщение DokSergey 16 авг 2012, 18:01

seaman писал(а):
transform.root.gameObject

выдаст объект корня, а не родителя


Ошибся...
GameObject родителя - transform.parent.gameObject
Аватара пользователя
DokSergey
UNец
 
Сообщения: 23
Зарегистрирован: 15 авг 2012, 09:17

Re: Как обратиться?.. [РЕШЕНО]

Сообщение piligrin 19 дек 2014, 20:38

В Родителе есть два объекта: А(с коллайдером) и В(внутри объекта С). На В висит этот скрипт . Как в скрипте В указать коллайдер объекта А? Нужно при столкновении игрока с триггером на А, повернуть объект В. Ну честное слово не получается.

Синтаксис:
Используется csharp
Transform myParent;
void Start(){
Collider = myParent.collider;
}

void OnTriggerEnter (Collider other){
     if (other.gameObject.tag == "Player") {
                        enter = true;
}
piligrin
UNITрон
 
Сообщения: 168
Зарегистрирован: 02 окт 2012, 18:25

Re: Как обратиться?.. [РЕШЕНО]

Сообщение piligrin 20 дек 2014, 00:04

Я пока так сделал. На А-объекте проверка триггера.Если игрок в триггере, отсылаем к В-объекту сообщение об этом. Но это лишний скрипт придётся вешать, не хотелось бы, и так всего понавешено. Может можно сразу из одного скрипта обратиться к чужому коллайдеру? Или из объекта А крутить объект В,если Игрок в триггере объекта А ?

Объект А:
Синтаксис:
Используется csharp
void Update () {

if(open){
            GetComponentInChildren<DoorOpen>().ope =true;
}
if(!open){
            GetComponentInChildren<DoorOpen>().ope = false;
}

if (Input.GetKeyDown(KeyCode.E) && enter){
                        open = !open;
}
}

void OnTriggerEnter (Collider other){
        if (other.gameObject.tag == "Player") {
                        enter = true;
        }
}      
       
}

Объект В:
Синтаксис:
Используется csharp
void Update (){
if(ope){
          //Open door
         transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, openRot, Time.deltaTime * smooth);
        }else{
                //Close door
                transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, defaultRot, Time.deltaTime * smooth);
             }
}
piligrin
UNITрон
 
Сообщения: 168
Зарегистрирован: 02 окт 2012, 18:25

Re: Как обратиться?.. [РЕШЕНО]

Сообщение DonTTGnev 20 дек 2014, 04:29

А почему бы тебе просто не сделать public GameObject и перетянуть в эдиторе - раз составляет трудность разобраться в дереве родителя.
DonTTGnev
UNIт
 
Сообщения: 126
Зарегистрирован: 10 сен 2014, 17:55

Re: Как обратиться?.. [РЕШЕНО]

Сообщение piligrin 20 дек 2014, 09:28

Оригинальная идея. Как-то не подумал об этом. :)
piligrin
UNITрон
 
Сообщения: 168
Зарегистрирован: 02 окт 2012, 18:25

Re: Как обратиться?.. [РЕШЕНО]

Сообщение Ingeneer 01 окт 2016, 05:38

На форуме Unity нашел занятный ответ по поводу GetComponentInParent:
Скрытый текст:
Even though i never used GetComponentInParent i guess it does work similar to GetComponentInChildren. What most don't know is that it starts searching on the given object and not on the first child or in the case of GetComponentInParent on the parent. So using this method to find a Transform will return the Transform of the object and not of the parent.

Both methods are actually badly named. They should be called something like:

FindComponentUpwards == GetComponentInParent

FindComponentDownward == GetComponentInChildren

If you just want to access the transform of the direct parent object, use:

Character = transform.parent;
If you want to access the top most parent, use:

Character = transform.root;

У кого с английским плохо, тут парень говорит о том, что название GetComponentInParent не отображает реального назначения функции, что скорее ее стоило бы назвать "ИскатьКомпонентВыше", чем "ВзятьКомпонентВРодителе". Объясняет он это тем, что функция начинает поиск компонента не с родительского объекта, а с объекта, к которому прикреплен скрипт, уже далее продвигаясь вверх по иерархии объектов, и потому возвращает нам прежде компонент объекта, вместо компонента из родителя. В документации при этом не поясняется эта особенность у функции, что она начинает рекурсию с объекта, а не с родителя.

Другой парень провел эксперимент:

Взял два GameObject'a Root и Child, поместив Child в Root.

Изображение

В Child он поместил следующий скрипт:

Синтаксис:
Используется csharp
 var t1 = transform.parent.GetComponent<Transform>();
 var t2 = GetComponentInParent<Transform>();
 
 Debug.Log (t1);
 Debug.Log (t2);
 


И вот что ему выдало в логах при запуске сцены

Изображение

Transform, полученный через GetComponentInParent<>() принадлежит объекту, на который прикреплен скрипт, а не родителю. Конечно, делал он это на JS, но и проверив на C# получилось все тоже самое.

Вывод: при одиночном выборе родителя надо пользоваться transform'ом.

Обращение же к дочернему объекту можно осуществлять через функцию GetChild(n), где n - порядковый номер дочернего объекта, начиная с 0 (0 означает первый объект). Пример:
Синтаксис:
Используется csharp
obj = transform.GetChild(0).gameObject;   //в аргументе функции GetChild() ставим 0 - выделяется первый (или единственный) дочерний объект
Debug.Log(obj.name);    //выведет наименование дочернего объекта
Ingeneer
UNец
 
Сообщения: 6
Зарегистрирован: 19 сен 2016, 17:27


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21