Обращение к подобъектам в скриптах

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

Обращение к подобъектам в скриптах

Сообщение Syberex 14 июл 2011, 09:44

Давно уже потыемся ковыряться в юнити и делать контент для игры, наконец нашли идею полегче, даже очень простую :D
и вот взялся за скрипты, но не пошло :(( ... Долго ковыряться времени не нахожу, потому решил с моим то прогерским опытом залесть в раздел почемучка и настрочить глупых вопросов:

1. Делаю иерархию объектов - пустышка и у нее в дочерних несколько стержней, вешаю скрипт на пустышку, из скрипта хочу вращать стержни по оси и двигать в стороны. Как я должен обратиться к подобъектам пустышки из скрипта?
Объект.подобъект - не хочет, GetComponent() как я понял не для этого, ...
Сделал только вращение самой пустышки и все вместе с ней, или чисто стержня (если повесить скрипт на него) - тоже вариант, но сам вопрос напрягает ...

2. Если вращаю стержень, а на нем сидят еще детали, вообщем он вращается у меня не по оси, а со смешением, видимо это центр всех объектов (стержень + детали на нем сидящие). Как бы сделать по оси?

Можно кусок кода, а можно и в хелп ткнуть, заранее спасибо ^:)^
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Обращение к подобъектам в скриптах

Сообщение raul82 14 июл 2011, 10:02

Можно попробовать перебрать всех чайлдоф

Синтаксис:
Используется csharp
foreach ( Transform child  In transform)
{
...
}
5 годиков 7 месяцев
Аватара пользователя
raul82
Старожил
 
Сообщения: 506
Зарегистрирован: 21 янв 2011, 17:48
Откуда: Алматы

Re: Обращение к подобъектам в скриптах

Сообщение Левш@ 14 июл 2011, 11:18

1. Делаю иерархию объектов - пустышка и у нее в дочерних несколько стержней, вешаю скрипт на пустышку, из скрипта хочу вращать стержни по оси и двигать в стороны. Как я должен обратиться к подобъектам пустышки из скрипта?

Простой способ обьявить публ. переменные и крутить локалы прямо на них. В переменные перетащить свои чилды.

Синтаксис:
Используется javascript
var obj_0 : Transform;

function LateUpdate ()  {
     obj_0.localRotation.y += 5;
}


Типа того... и т.д. :)
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Обращение к подобъектам в скриптах

Сообщение seaman 14 июл 2011, 13:32

Как я должен обратиться к подобъектам пустышки из скрипта

Transform.Find - ищет дитя по имени

Сразу вопрос спецам. чем отличается transform.Find от transform.FindChild? Второго метода в справке нет - на самом деле есть.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к подобъектам в скриптах

Сообщение Zaicheg 14 июл 2011, 13:46

Наверняка ничем и просто оставили устаревший метод для совместимости. Там полно таких.
Автор, ещё для доступа к чилдам: Transform.GetChild (вместе с Transform.childCount)
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Обращение к подобъектам в скриптах

Сообщение seaman 14 июл 2011, 15:32

Find ищет только прямых потомков. Чтобы найти более глубоко запрятанных потомков можно использовать скрипт:
Синтаксис:
Используется csharp
    public static Transform SearchChild(Transform tr, string name)
    {
        //Для всех детей
        for(int i = 0; i < tr.childCount; i++)
        {
            //Берем очередного ребенка
            Transform tt = tr.GetChild(i);
            //Если имя совпало - сразу возвращаемся
            if (tt.name == name) return tt;
            //Если у него нет детей - к следующему ребенку
            if (tt.childCount == 0) continue;
            //Дети у ребенка есть - пытаемся найти среди них
            Transform ti = SearchChild(tt, name);
            //Нашли среди детей очередного ребенка! - возвращаем находку
            if (ti != null) return ti;
        }
        //Всех детей и их потомков просмотрели, но ничего не нашли.
        return null;
    }
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к подобъектам в скриптах

Сообщение Zaicheg 14 июл 2011, 17:04

Чтобы найти более глубоко запрятанных потомков можно использовать скрипт:

По-моему, в такой ситуации простой перебор трансформов выглядят как-то более понятно.
Синтаксис:
Используется csharp
Transform trs = GetComponentsInChildren<Transform>();
foreach(Transform tr in trs)
    if (tr.name == myName)
        return tr;
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Обращение к подобъектам в скриптах

Сообщение seaman 14 июл 2011, 19:39

Да, конечно. Что-то мне довольно заумное в голову пришло. Хорошо хоть рабочее.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к подобъектам в скриптах

Сообщение DbIMok 14 июл 2011, 19:41

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

Re: Обращение к подобъектам в скриптах

Сообщение seaman 14 июл 2011, 19:47

О чем и речь - если есть только имя чайлда, а неизвестен путь, то нельзя. В Find нужно вводить полный путь к ребенку.
Зачем нужно?
Пример - прикрепляем оружие или к поясу, или к руке. Разные пути к оружию, а имя у него одно.
Еще пример. Составной перс. Части могут иметь разные названия. В один момент у него рука, в другой - перчатка. А нам нужна кость руки. Пути разные, а название кости одно.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к подобъектам в скриптах

Сообщение Syberex 15 июл 2011, 01:14

Всем спасибо за ответы! В выходные продолжу свои ковыряния :D

Простой способ обьявить публ. переменные и крутить локалы прямо на них. В переменные перетащить свои чилды.

Не совсем понял как перетащить, в редакторе? Или сделать первый раз поиск и запомнить в переменной?
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Обращение к подобъектам в скриптах

Сообщение AndreyMust19 01 авг 2011, 15:05

Оказывается чтобы получить игровой объект, достаточно иметь хотя бы один его компонент. Ведь движок-то должен знать чей это компонент? Поэтому достаточно найти любой компонент дочерних объектов (с помощью GetChild или GetComponentInChildren) и спросить у него поле gameObject, к-й ссылается на объект, к-му этот компонент принаджежит.
Это поле сложно найти в описании класса Component, оно хорошо спряталось между остальными полями. А находится в самом конце - перед ссылкой на поле tag.

Проверить это можно так:
Синтаксис:
Используется csharp
uint numZones = (uint)rootAuto.transform.childCount;
WalkZoneData[] zn = rootAuto.GetComponentsInChildren<WalkZoneData>();
for (uint i = 0; i < numZones; i++)
{
        Debug.Log("Object = " + zn[i].gameObject);
}
 
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Обращение к подобъектам в скриптах

Сообщение Zaicheg 01 авг 2011, 15:09

AndreyMust19, а какой смысл в описанных действиях, применительно к данной теме?
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец


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

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 17