Перейти к содержимому

Как сделать объект дочерним в unity через скрипт

  • автор:

Управление игровыми объектами (GameObjects) с помощью компонентов

В редакторе Unity вы изменяете свойства Компонента используя окно Inspector. Так, например, изменения позиции компонента Transform приведет к изменению позиции игрового объекта. Аналогично, вы можете изменить цвет материала компонента Renderer или массу твёрдого тела (RigidBody) с соответствующим влиянием на отображение или поведение игрового объекта. По большей части скрипты также изменяют свойства компонентов для управления игровыми объектами. Разница, однако, в том, что скрипт может изменять значение свойства постепенно со временем или по получению ввода от пользователя. За счет изменения, создания и уничтожения объектов в заданное время может быть реализован любой игровой процесс.

Обращение к компонентам

Наиболее простым и распространенным является случай, когда скрипту необходимо обратиться к другим компонентам, присоединенных к тому же GameObject. Как упоминалось во разделе Введение, компонент на самом деле является экземпляром класса, так что первым шагом будет получение ссылки на экземпляр компонента, с которым вы хотите работать. Это делается с помощью функции GetComponent. Типично, объект компонента сохраняют в переменную, это делается в C# посредством следующего синтаксиса:

void Start () < Rigidbody rb = GetComponent(); > 

В UnityScript синтаксис немного отличается:

function Start () < var rb = GetComponent.(); > 

Как только у вас есть ссылка на экземпляр компонента, вы можете устанавливать значения его свойств, тех же, которые вы можете изменить в окне Inspector:

void Start () < Rigidbody rb = GetComponent(); // Change the mass of the object's Rigidbody. rb.mass = 10f; > 

Дополнительная возможность, недоступная в окне Inspector — вызов функций экземпляра компонента:

void Start () < Rigidbody rb = GetComponent(); // Add a force to the Rigidbody. rb.AddForce(Vector3.up * 10f); > 

Имейте ввиду, что нет причины, по которой вы не можете иметь больше одного пользовательского скрипта, присоединенного к одному и тому же объекту. Если вам нужно обратиться к одному скрипту из другого, вы можете использовать, как обычно, GetComponent, используя при этом имя класса скрипта (или имя файла), чтобы указать какой тип Компонента вам нужен.

Если вы попытаетесь извлечь Компонент, который не был добавлен к Игровому Объекту, тогда GetComponent вернет null; возникнет ошибка пустой ссылки при выполнении (null reference error at runtime), если вы попытаетесь изменить какие-либо значения у пустого объекта.

Обращение к другим объектам

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

Связывание объектов через переменные

Самый простой способ найти нужный игровой объект — добавить в скрипт переменную типа GameObject с уровнем доступа public:

public class Enemy : MonoBehaviour < public GameObject player; // Other variables and functions. >

Переменная будет видна в окне Inspector, как и любые другие:

Теперь вы можете перетащить объект со сцены или из панели Hierarchy в эту переменную, чтобы назначить его. Функция GetComponent и доступ к переменным компонента доступны как для этого объекта, так и для других, то есть вы можете использовать следующий код:

public class Enemy : MonoBehaviour < public GameObject player; void Start() < // Start the enemy ten units behind the player character. transform.position = player.transform.position - Vector3.forward * 10f; >> 

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

public Transform playerTransform; 

Соединение объектов через переменные наиболее полезно, когда вы имеете дело с отдельными объектами, имеющими постоянную связь. Вы можете использовать массив для хранения связи с несколькими объектами одного типа, но связи все равно должны быть заданы в редакторе Unity, а не во время выполнения. Часто удобно находить объекты во время выполнения, и Unity предоставляет два основных способа сделать это, описанных ниже.

Нахождение дочерних объектов

Иногда игровая сцена может использовать несколько объектов одного типа, таких как враги, путевые точки и препятствия. Может возникнуть необходимость отслеживания их в определенном скрипте, который управляет или реагирует на них (например, все путевые точки могут потребоваться для скрипта поиска пути). Можно использовать переменные для связывания этих объектов, но это сделает процесс проектирования утомительным, если каждую новую путевую точку нужно будет перетащить в переменную в скрипте. Аналогично, при удалении путевой точки придется удалять ссылку на отсутствующий объект. В случаях, наподобие этого, чаще всего удобно управлять набором объектов, сделав их дочерними одного родительского объекта. Дочерние объекты могут быть получены, используя компонент Transform родителя (так как все игровые объекты неявно содержат Transform):

using UnityEngine; public class WaypointManager : MonoBehaviour < public Transform[] waypoints; void Start() < waypoints = new Transform[transform.childCount]; int i = 0; foreach (Transform t in transform) < waypoints[i++] = t; >> > 

Вы можете также найти заданный дочерний объект по имени, используя функцию Transform.Find:

transform.Find("Gun"); 

Это может быть полезно, когда объект содержит дочерний элемент, который может быть добавлен или удален в игровом процессе. Хороший пример — оружие, которое может быть подобрано и выброшено.

Нахождение объектов по имени или тегу

Нахождение игровых объектов в любом месте иерархии доступно всегда, когда у вас есть некоторая информация, по которой их можно идентифицировать. Отдельные объекты могут быть получены по имени, используя функцию GameObject.Find:

GameObject player; void Start()

Объект или коллекция объектов могут быть также найдены по их тегу, используя функции GameObject.FindWithTag и GameObject.FindGameObjectsWithTag:-

GameObject player; GameObject[] enemies; void Start()

Как сделать объект дочерним в unity через скрипт

Текущее время: 08 янв 2024, 18:55

как сделать объект дочерним через скрипт

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.
Сообщений: 2 • Страница 1 из 1

как сделать объект дочерним через скрипт

BlackMamba 03 авг 2011, 23:40

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

mail: _gdeMoiGusi@gmail.com
skype: Ellseworth

BlackMamba UNITрон Сообщения: 305 Зарегистрирован: 06 янв 2011, 16:16 Откуда: Москва

Re: как сделать объект дочерним через скрипт

V0odo0 03 авг 2011, 23:47

Game Development | Урок 32: Родительские и дочерние объекты.

Чек-лист успешной адаптации или как пройти испытательный срок в компании?

10 ключевых ошибок во время собеседования

Подготовка к собеседованию в IT

Активный поиск первой работы в IT – советы и частые ошибки

IТ в период войны: как найти первую работу

Использование и оптимизация UI системы при создании игр в Unity.

На этом уроке «Родительские и дочерние объекты в (Action Script 3.0)» — родственные связи во флеш. Как из основного тела кода обращаться ко вложенным элементам и наоборот? Смотрите еще больше полезных уроков на ITVDN.

Покупай подписку с доступом ко всем курсам и сервисам

Библиотека современных IT знаний в удобном формате

Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.

  • Все видеокурсы на 3 месяца
  • Тестирование по 10 курсам
  • Проверка 5 домашних заданий
  • Консультация с тренером 30 мин
  • Все видеокурсы на 6 месяцев
  • Тестирование по 16 курсам
  • Проверка 10 домашних заданий
  • Консультация с тренером 60 мин
  • Все видеокурсы на 1 год
  • Тестирование по 24 курсам
  • Проверка 20 домашних заданий
  • Консультация с тренером 120 мин

Как создавать объект в другом пустом объекте в unity?

Нужно при создании объекта на сцене, создавать внутри него дочерние объекты. Пробовал функцию Instantiate (она используется для создания на сцене родительского объекта), но она умеет создавать объекты только внутри сцены, а не внутри объектов, находящихся на сцене. Вариант создания дочернего объекта на самой сцене и перемещения его потом в нужный родительский объект не подходит, т. к. и родительских и дочерних объектов нужно очень много, будет (наверно) тормозить. Как создавать дочерние объект сразу в родительском?

Голосование за лучший ответ

Всё просто: у функции Instantiate есть перегрузка, позволяющая указать родительский объект:
===
var newObject = Instantiate (prefab, transform).

где prefab — ссылка на префаб объекта или «оригинал», копию которого вы хотите создать;
transform — компонент «Transform» объекта, который должен стать родительским для newObject.
===

максим мальцевУченик (33) 3 года назад

Не очень понял как это работает. Получается, создаётся сразу и дочерний и родительский объект? У меня есть один скрипт, который создаёт родительские объекты, и уже на каждом из них висит скрипт, который должен создать дочерние объекты в родительском. То есть команда создания родительского объекта и команда создания дочернего объекта находятся в разных скриптах, а через перегрузку, на сколько я понял, создаётся сразу всё

максим мальцевУченик (33) 3 года назад

Попробовал делать всё в одном скрипте, но тогда все дочерние объекты имеют координаты родительского. Я делаю плоскость из блоков, она состоит из объектов 16 на 16, в них должен находиться участок, соответственно, 16 на 16 блоков, но сейчас получается, родительский объект и все блоки (дочерние объекты) находятся на одних координатах

FF Мыслитель (5779) максим мальцев, задать позицию объектам можно через присвоение позиции в transform, или с помощью другой перегрузки Instantiate, которая позволяет задать и позицию, и вращение спавнящимся объектам. Вопрос был сугубо про инстанцирование родительских и дочерних объектов — и если иерархия создаётся, то решение получено.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *