как сделать объект дочерним в unity через скрипт
Дочерний объект
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Отвязать дочерний объект
Как отвязать через скрипт дочерний объект?
Префаб как дочерний объект
при нажании на кнопку, префаб создается не там где нужно. Как его создать именно там где он был.
Не отображается дочерний объект в префабе
Доброго времени суток. Сейчас осваиваю Unity и столкнулся с проблемой. Есть префаб, например.
Кинематический объект не проходит через объект твердого тела
есть идеи как сделать объект, на который физика не влияет (двигается с помощью transform.position).
Добавлено через 7 минут
Данный скрипт создает пустой game object, а вот, скажем у меня есть префаб, который я хочу создать внутри камеры. Как мне это сделать?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Анимация материнского объекта, так чтобы дочерний оставался на месте
Всем привет. Как в Unity делать анимацию материнского объекта, не затрагивая параметры перемещения.
Дочерний селектор
Никак не могу разобраться по какой причине элемент li второго уровня(подэлемент1|2|3) меняет свой.
Дочерний процесс
Как передать аргумент size в дочерний процесс?) Как объявить массив. На ubuntu компилятор gcc.
Дочерний процесс
Скажите, пожалуйста, где описывать дочерние процессы. То есть я создаю, допустим в Visual c++.
Управление игровыми объектами (GameObjects) с помощью компонентов
В редакторе Unity вы изменяете свойства Компонента используя окно Inspector. Так, например, изменения позиции компонента Transform приведет к изменению позиции игрового объекта. Аналогично, вы можете изменить цвет материала компонента Renderer или массу твёрдого тела (RigidBody) с соответствующим влиянием на отображение или поведение игрового объекта. По большей части скрипты также изменяют свойства компонентов для управления игровыми объектами. Разница, однако, в том, что скрипт может изменять значение свойства постепенно со временем или по получению ввода от пользователя. За счет изменения, создания и уничтожения объектов в заданное время может быть реализован любой игровой процесс.
Обращение к компонентам
Наиболее простым и распространенным является случай, когда скрипту необходимо обратиться к другим компонентам, присоединенных к тому же GameObject. Как упоминалось во разделе Введение, компонент на самом деле является экземпляром класса, так что первым шагом будет получение ссылки на экземпляр компонента, с которым вы хотите работать. Это делается с помощью функции GetComponent. Типично, объект компонента сохраняют в переменную, это делается в C# посредством следующего синтаксиса:
В UnityScript синтаксис немного отличается:
Как только у вас есть ссылка на экземпляр компонента, вы можете устанавливать значения его свойств, тех же, которые вы можете изменить в окне Inspector:
Имейте ввиду, что нет причины, по которой вы не можете иметь больше одного пользовательского скрипта, присоединенного к одному и тому же объекту. Если вам нужно обратиться к одному скрипту из другого, вы можете использовать, как обычно, GetComponent, используя при этом имя класса скрипта (или имя файла), чтобы указать какой тип Компонента вам нужен.
Если вы попытаетесь извлечь Компонент, который не был добавлен к Игровому Объекту, тогда GetComponent вернет null; возникнет ошибка пустой ссылки при выполнении (null reference error at runtime), если вы попытаетесь изменить какие-либо значения у пустого объекта.
Обращение к другим объектам
Пусть иногда они и существуют изолированно, все же, обычно, скрипты отслеживают другие объекты. Например, преследующий враг должен знать позицию игрока. Unity предоставляет несколько путей получения других объектов, каждый подходит для конкретной ситуации.
Связывание объектов через переменные
Переменная будет видна в окне Inspector, как и любые другие:
Теперь вы можете перетащить объект со сцены или из панели Hierarchy в эту переменную, чтобы назначить его. Функция GetComponent и доступ к переменным компонента доступны как для этого объекта, так и для других, то есть вы можете использовать следующий код:
Кроме того, если объявить переменную с доступом public и заданным типом компонента в вашем скрипте, вы сможете перетащить любой объект, который содержит присоединенный компонент такого типа. Это позволит обращаться к компоненту напрямую, а не через игровой объект.
Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе Unity, а не во время выполнения. Часто удобно находить объекты во время выполнения, и Unity предоставляет два основных способа сделать это, описанных ниже.
Нахождение дочерних объектов
Иногда игровая сцена может использовать несколько объектов одного типа, таких как враги, путевые точки и препятствия. Может возникнуть необходимость отслеживания их в определенном скрипте, который управляет или реагирует на них (например, все путевые точки могут потребоваться для скрипта поиска пути). Можно использовать переменные для связывания этих объектов, но это сделает процесс проектирования утомительным, если каждую новую путевую точку нужно будет перетащить в переменную в скрипте. Аналогично, при удалении путевой точки придется удалять ссылку на отсутствующий объект. В случаях, наподобие этого, чаще всего удобно управлять набором объектов, сделав их дочерними одного родительского объекта. Дочерние объекты могут быть получены, используя компонент Transform родителя (так как все игровые объекты неявно содержат Transform):
Вы можете также найти заданный дочерний объект по имени, используя функцию Transform.Find:
Создание экземпляров префабов во время работы приложения
Префабы приходятся очень кстати, когда вы хотите создать экземпляры сложных игровых объектов во время игрового процесса. Альтернативой создания экземпляров префабов является создание GameObject с нуля используя код. Создание экземпляра префаба имеет много преимуществ над альтернативным подходом:
Общие сценарии
Чтобы показать мощь префабов, давайте рассмотрим некоторые основные ситуации, где они могут пригодиться:
Построение стены
Это объяснение иллюстрирует преимущества использования префабов над созданием объектов из кода.
В первую очередь, давайте построим стену из кода:
Если вы создадите префаб и выполните все установки вручную, то вам понадобится использовать лишь по одной строке на создание и установку каждого кирпича. Это освобождает вас от поддержания и изменения тонн кода, когда вы хотите внести изменения. При использовании префаба вы просто вносите изменения в него и жмёте Play. Совсем нет надобности изменять код.
Если вы используете префаб для каждого кирпича, то вот код, который вам понадобится для создания стены.
Он не только очень чистый, но им можно пользоваться много раз. В нём не упоминается ни создание куба, ни то, что он должен содержать Rigidbody. Всё это задано в префабе, который может быть быстро создан в редакторе
Теперь нам остаётся лишь создать префаб, который мы делаем в редакторе. Вот так:
Мы создали наш префаб кирпича, так что теперь надо присоединить переменную brick к нашему скрипту. Когда вы выбираете пустой GameObject, что содержит скрипт, переменная brick будет видна в инспекторе.
Теперь перетащите префаб “Brick” из окна Project View на переменную brick в инспекторе. Нажмите Play и вы увидите стену построенную из префабов.
Этот шаблон рабочего процесса можно использовать и использовать в Unity. В начале вы, возможно, будете интересоваться, почему же это лучше, чем создание куба из кода, который длиннее лишь на две строки.
Но т.к. вы сейчас используете префаб, вы можете настроить Prefab за секунды. Хотите внести изменения для всей кучи образцов? Настройте Rigidbody в префабе всего один раз. Хотите использовать иной Material для всех образцов? Перетащите материал на префаб всего один раз. Хотите изменить трение? Используйте другой физический материал ( Physic Material ) в коллайдере префаба. Хотите добавить системы частиц ко всем кирпичам? Добавьте дочернюю систему к префабу всего один раз.
Создание экземпляров ракет и взрывов
Вот как префабы подходят для данного сценария:
В то время как можно собрать объект ракеты полностью из кода, вручную добавляя компоненты и устанавливая свойства, было бы гораздо проще просто создать экземпляр префаба. Вы можете создать экземпляр ракеты просто одной строкой кода, не важно, насколько сложным будет префаб ракеты. После создания экземпляра префаба, вы также можете изменить любые свойства созданного экземпляра объекта (например, вы можете установить скорость Rigidbody ракеты).
Замена персонажа на Ragdoll или обломки
Допустим у вас есть вражеский персонаж с ригом и он умирает. Вы можете просто проиграть анимацию смерти и отключить все скрипты, которые обычно отвечают за логику врага. Вам, скорее всего, придётся позаботиться об удалении нескольких скриптов, добавлении некоторой дополнительной логики, чтобы убедиться, что никто не будет атаковать уже мёртвого врага, и о других задачах очистки.
Гораздо лучше будет подход, включающий мгновенное удаление всего персонажа, и замена его созданным экземпляром префаба обломков. Это даёт вам больше возможностей. Вы можете использовать другой материал для мёртвого персонажа, присоединить совершенно другие скрипты, создать экземпляр префаба содержащий объект сломанный на много кусков, чтобы симулировать разбившегося врага, или просто создать экземпляр префаба, содержащий определённую версию персонажа.
Это стандартные шаги, если надо собрать префаб сломанного самолёта:
Следующий пример покажет, как эти шаги моделируются в коде.
Размещение группы объектов по заданному шаблону
Допустим вы хотите поместить группу объектов по сетке или кругу. Как всегда, это может быть выполнено двумя способами:
Так используйте вместо этого Instantiate() с префабом! Мы думаем, что вы уже поняли нашу идею, почему префабы так удобны в этих случаях. Вот необходимый для этих сценариев код:
Скрипты в Unity3D. Урок 0. Основы
Два основных компонента у объекта в Unity3D — это Transform и GameObject.
GameObject
GameObject — основа, контейнер, который содержит в себе все компоненты любой объект в Unity3D. Чтобы удалить, к примеру, игровой объект — удалять нужно именно GameObject этого объекта. Для доступа к GameObject — используется переменная, которая присутствует по умолчанию в любом скрипте, унаследованном от MonoBehaviour (то есть в любом скрипте, созданном через Unity3D).
Получение ссылки на игровой объект
Данным способом можно из одного скрипта получить ссылку на другие игровые объекты и управлять ими, их дочерними объектами, а также их компонентами.
Уничтожение игрового объекта
Данным способом можно удалить игровой объект.
Активация/деактивация игрового объекта
Деактивация объекта аналогична снятия галочки инспекторе Unity3D, которая обведена красным цветом на скриншоте ниже.
Деактивация элемента деактивирует также все его дочерние объекты и останавливает выполнение в их скриптов.
Добавление новых компонентов и скриптов игровому объекту
Таким образом можно добавить абсолютно любой компонент, либо скрипт, который можно добавить в редакторе Unity3D.
Получение доступа к компоненту игрового объекта
Таким же образом можно получить доступ к любому компоненту игрового объекта.
Переименование игрового объекта. Считывание имени объекта
Сделать объект статичным
Данный код аналогичен установке/снятию галочки в редакторе Unity3D (на скрине ниже).
Установить слои игровому объекту, а также считать их
Установить тэг игровому объекту, а также его считывание
Transform
С трансформом всё немного проще — этот компонент не является основой, но тем не менее — является основной и, главное, неотъемлемой частью GameObject’а. Он отвечает за месторасположение объекта на сцене, его «вращении», размерах, а также содержит информацию о дочерних и родительском объектах.
Это единственные компонент, который невозможно удалить из GameObject.
Изменение положение объекта
За положение объекта на сцене отвечает элементы transform.position и transform.localPosition.
Они оба являются переменной типа Vector3 и имеют в себе 3 главных составляющих x,y и z, которые соответствуют координатам в трехмерном пространстве. Следует учитывать, что x, y и z невозможно менять напрямую — они только для чтения. Чтобы добавить единичку к x — нужно добавить к самому transform.position новый Vector3, который равен (1,0,0), что добавить к x единицу, а к y и z — нули.
Чем же отличаются transform.position и transform.localPosition?
Их главное (и единственное отличие) заключается в том, что position — показывает и принимает координаты объекта, относительно мировых координат, а localPosition — относительно родительского объекта. Если же игровой объект является «корневым», то есть у него нет родительских объектов, то position и localPosition будут равны.
Движение объекта
Сначала рассмотрим элементарные варианты.
Как мы уже говорили — position (буду далее использовать именно его, так как отличия от localPosition только в том, относительно чего эти координаты) является переменной типа Vector3. Поэтому для его изменения нужно либо прибавить к нему другой вектор, либо вычесть другой вектор, либо заменить его другим вектором.
Рекомендуется использовать функцию transform.Translate.
Это уже не переменная, как transform.position — это функция. У неё есть два входящих параметра:
Вращение объекта
За вращение объекта отвечает компонент transform.rotation, transform.localRotation и функция transform.Rotate.
Здесь все аналогично transform.position. Кроме одного, несмотря на то, что в редакторе Unity3D Rotation представляет собой Vector3, то есть вращение относительно оси X, оси Y, оси Z. Но в коде оно представлено в виде кватернионов. Что такое кватернион — отдельная история. И обычно её изучают в вузах. По факту — знание кватернионов не обязательно для разработки игр. К счастью разработчики Unity3D это понимают и сделали две удобные для программистов вещи:
Меньше слов — больше кода:
Вместо rotation можно применять localRotation, аналогично position.
Такой подход аналогичен transform.Translate и также является более производительным.
Поиск других объектов на сцене
Есть два подхода поиска объекта на сцене.
Также можно запрашивать дочерние элементы по их номеру:
Также дочерний элемент может запросить родительский, а также родительский родительского и так далее:
В следующих статьях будет информация о том, что такое private, public, static, отправление сообщений игровым объектам.
12 комментариев для “Скрипты в Unity3D. Урок 0. Основы”
Отличный урок! Планируется ли продолжение?
Здравствуйте! Да, продолжение планируется и уже есть заготовки, но времени, увы, нет совсем =(
Присоединяюсь к предыдущем комментатору, очень жду продолжения.
Ну и отдельное спасибо за этот урок.
И коментарии бы типа:
var childTransform = transform.FindChild(«myChild1»); // находим myChild1 помещаем в childTransform
var childGameObject = childTransform.gameObject; // тут что происходит я хрен чё понимаю откуда что берётся
var anotherTransformLink = childGameObject.transform; // и зачем столько букав
А так-то нормуль, есть что законспектировать.
Здравствуйте! Спасибо за советы, я обязательно их учту при написании следующих статей.
Постараюсь вкратце ответить на ваши вопросы.
1) Слова в коде относятся к командам, классам, интерфейсам, или именам переменных. Обычно в C# с большой буквы пишется класс, интерфейс, или переменная с модификатором доступа ‘public’ (не забываем про функции). Где, как и в каких случаях что используется тяжело описать, так как это основы языка программирования C#.
Например:
var myObject = new MyObject().
Конкретно в данном случае — MyObject — это класс. А myObject — это конкретный экземпляр класса MyObject.
А вот другой пример:
public GameObject MyGameObject;
Это публичное свойство класса типа GameObject. Сам экземпляр данного класса называется MyGameObject и может быть доступен как и изнутри самого класса, так и из других классов, у которых есть ссылка на данный экземпляр класса.
2) Почему objectBoxCollider с маленькой, а BoxCollider с большой? ObjectBoxCollider — это имя класса, а objectBoxCollider — это его экземпляр..
К тому же Unity3d очень активно использует наследование (хотя бы взять любой скрипт — он наследован от MonoBehavior. Нужно знать как работает наследование и какой базовый функционал (и какие свойства) уже доступны «из коробки» у любого класса, который будет наследован от него.
Всё-таки Unity3D подразумевает, что у разработчика есть базовые знания C#, или JS. Я бы вам порекомендовал вначале почитать статьи с замечательного сайта https://metanit.com/sharp/tutorial/
Лучше чем там я объяснить всё равно не смогу 🙂
оО, о как, очень рад что сайт живой,ато вновь и вновь прочёсываю инет своими тегами, гляжу — котодомик))
думаю — та-ак, помню что там чтото полезное было пойду ещё загляну) а тут опаньки, живая планета,.
только вот пользователи сетей видать не очень жалуют домен «рф» и встречается он редковато,
буду значит наблюдать за сайтом,по возможности единомышленников подтягивать,
пс
C#
transform.position += new Vector3(1,0,0); // добавляем к X единице (смещаем на единицу)
transform.position += new Vector3(1,0,2)*Time.deltaTime; // двигаем объект в реальном времени с установленными значениями
по осям х и z
int speed = 5;
void Start()
transform.position += new Vector3(speed,0,0)*Time.deltaTime;//движение по оси х с заданием параметра(скорости) через переменную speed
transform.position += new Vector3(1,0,1)*speed*Time.deltaTime;// движение по заданным осям со скоростью установленной переменной speed
вот типа того бы, с пояснениями и дальнейшим развитием их применения
ещё поподробней бы про кватернионы и ейлеры, каким образом кватернион вывести в вектор3
про ригидбоди — нет нигде информации, как ограничивать угол поворота по осям,матф.кламп
как использовать драг по разным осям с разным значением
гравитация и енерция их ограничения и направления,
почему объект в вертикальном положении может подвергаться гравитации а в горизонтальном уже нет..+-
Спасибо за отзыв! Приятно! 🙂
Стараюсь поддерживать актуальность сайта по мере сил и возможности.
Отдельное спасибо за темы для новых статей.
Спасибо очень сильно помог, ещё раз большое спасибо.
есть vector3 как взять по нему gameObject?
Здравствуйте. К сожалению никак. Vector3 это структура данных, которая содержит информацию о точках X,Y,Z.
Vector3, как и Vector2 стоит рассматривать наравне с int, string, bool, float..
Например. Контейнер gameObject всегда содержит ссылку на компонент (обязательный) transform.
А transform содержит много свойств, отвечающих за позицию и размер объекта на сцене. Одно из свойств, как раз position — является Vector3.
Через любой компонент можно получить ссылку на gameObject, как и через gameObject можно получить ссылку на любой компонент, который данный gameObject содержит внутри себя.
Например: var boxCollider = gameObject.GetComponent ();
Но Vector3 не является компонентом в Unity3D.
Являются компонентами только те объекты, которые можно добавить к gameObject’у, используя графический интерфейс редактора Unity3D.
Спасибо за хорошо изложенную информацию) Сделал по туторам три простеньких игру, просто повторяя все за автором курса. Но во многое не въехал. Тут почитал, многое встало на свои места сразу. У вас талант к ясному изложению. Не бросайте это дело)
Здравствуйте! Большое спасибо за ваш отзыв 🙂
К сожалению сейчас нет особой возможности вести блог.
Но если у вас есть какие-то конкретные вопросы по Unity3D, то я могу с удовольствием на них ответить.
Доступ к дочернему объекту
Подскажите плиз, такая ситуация:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Доступ к объекту
Доброго времени суток. Начал изучать юнити, но никак не могу понять, как получить доступ к объекту.
Как получить доступ к объекту из сцены?
Прикрепил скрипт Click к префабу. Для работы скрипта нужен объект из сцены со скриптом Score, но.
Как прикрепить линию к объекту и провести к другому объекту?
Привет. Вот вариант с помощью метода Gizmos.DrawLine. Как видите линия проходит с центра одного.
Доступ актёра к дочернему прецеденту (диаграмма прецедентов)
Подскажите: может ли актёр вызывать сразу дочерний прецедент, минуя родительский? Ситуация такая.
Ещё вопрос в эту тему.
Мне нужно было получить компонент Animator у дочернего объекта с тегом «Items».
Сделал это таким образом:
Решение
Добрый день, что-то перебрал в 2019.3 разные методы не могу допереть как искать внутри объекту по нужному тегу.
У меня объект, структура такая:
— Главный пустой объект с прицепленными компонентами Корпус 0.
внутри ещё два объекта:
объект 1
объект 2
об2 = GetComponentInChildren
так я получаю объект 2. Мне это и нужно.
Но дальше внутренних объектов будет больше. Все с уникальными тегами.
Подскажите как сделать не GetChild(1) (по ID), а поиск по тегу?.
об2 = parentTransform.Cast
или
об2 = gameObject.parentTransform.Cast
Мне нужна итоговая ссылка на объект дочерний, для доступа к компонентам.
найти дочерний с тегом(по названию тега)
Скрипт висит на основном объекте. Тоесть так? :
Возможно такие конструкции можно применить для каких то сложных задач.
Я пока их понять не могу. Как я уже говорил мне просто нужен был дочерний
объект чтобы я мог с ним по ссылке сделать что угодно.
Но всё равно спасибо, помогли натолкнуться на новые идеи.
Сначала я пытался искать по тегу :
if (GetComponentInChildren
Перебирая number в цикле (number считал как GetComponentInChildren
И вроде всё логично и должно было работать, но «UnityException: Transform child out of bounds»
Такое должно быть только если childCount тупо врёт. Иногда поражает логика простых вещей которая не работает.
Для тех у кого схожие задачи, в итоге всё решается одной строкой:
childObject = GetComponentInChildren
Поиск осуществляется по имени объекта в иерархии родительского объекта.