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

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

СообщениеДобавлено: 01 авг 2012, 23:52
denri11
Как обратиться к дочернему объекту и как обратиться к родительскому объекту, не используя имен (не Find'ом)? И с разной глубиной иерархии.

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

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




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

СообщениеДобавлено: 16 авг 2012, 14:54
denri11
Через transform.parent.parent или transform.root я получаю Transform родителя, а как получить GameObject родителя?

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

СообщениеДобавлено: 16 авг 2012, 14:58
DokSergey
Синтаксис:
Используется csharp
foreach (var ob in Parent.GetComponentsInChildren<Transform>())
                child = ob.gameObject;
 

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

СообщениеДобавлено: 16 авг 2012, 15:04
DokSergey
denri11 писал(а):Через transform.parent.parent или transform.root я получаю Transform родителя, а как получить GameObject родителя?

Ну а GameObject родителя - ttransform.root.gameObject

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

СообщениеДобавлено: 16 авг 2012, 17:55
seaman
transform.root.gameObject

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

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

СообщениеДобавлено: 16 авг 2012, 18:01
DokSergey
seaman писал(а):
transform.root.gameObject

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


Ошибся...
GameObject родителя - transform.parent.gameObject

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

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

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

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

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

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

Объект А:
Синтаксис:
Используется 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);
             }
}

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

СообщениеДобавлено: 20 дек 2014, 04:29
DonTTGnev
А почему бы тебе просто не сделать public GameObject и перетянуть в эдиторе - раз составляет трудность разобраться в дереве родителя.

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

СообщениеДобавлено: 20 дек 2014, 09:28
piligrin
Оригинальная идея. Как-то не подумал об этом. :)

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

СообщениеДобавлено: 01 окт 2016, 05:38
Ingeneer
На форуме 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);    //выведет наименование дочернего объекта