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

Как обратиться к дочерним объектам unity

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как обратиться к дочернему объекту через родительский?

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

Вадим Мороз's user avatar

GetChild — Returns a transform child by index.

Find — Finds a child by name and returns it.

Valera Kvip's user avatar

Если вам нужно получить ссылку на все дочерние объекты то сделать это можно непосредственно из родительского Transform который хранит всю информацию об иерархии вложенных объектов. При помощи childCount можно узнать количество детей, а при помощи hierarchyCount количество всех объектов вложенной иерархии. Зная количество потомков вы можете перебором получить доступ к любому из них посредством функции GetChild.

Поиск через Find может оказаться более ресурсоемким, поэтому его не рекомендуется использовать в Update или FixedUpdate . К тому же можно просто перебрать все вложенные элементы просто через энумератор Transform:

Еще один вариант это если вы собираетесь работать с информацией в компонентах детей найти их все скажем на Start и сохранить на них ссылки чтобы работать с ними напрямую (в том случае если иерархия объектов в сцене не изменяется). Найти вложенные компоненты можно при помощи метода GetComponentsInChildren которая вернет вам все компоненты у родителя и детей вашего Transform по заданному типу в виде массива ссылок.

4 Easy Ways to Get Child Objects In Unity

Nesting objects under another object is very useful for many situations, such as making an object’s position relative to another object. When you want to get child objects in Unity to run some functions on them all at the same time, you will need some ways to access those nested objects. Fortunately, Unity provides multiple ways of accessing child objects.

The simplest way to get a child object of a game object in Unity is to use the Find method of the Transform class, i.e. transform.Find(“Child Object’s Name”). This method will return the target child object which you can then perform various things with. If the object with the specified name doesn’t exist, the method will return null.

Unity provides various ways of accessing child objects such as getting a child object by name, getting a child object by its order within the parent object, or even getting all children of an object. Below, you will find various ways to get child objects in Unity.

Table of Contents

  • How to Get A Child Object of An Object by Name in Unity
  • How to Get A Child Object of An Object by Its Index in Unity
  • How to Get Child Objects of An Object in Unity
  • How to Call A Method In All Child Objects of An Object in Unity

How to Get A Child Object of An Object by Name in Unity

If you know the name of the child object you want to access, using the Transform.Find method is the simplest way to access the target child object.

Let’s say we have a game object with multiple child objects:

Now, if you want to get the object named “Child02” that is nested under the parent object named “TheParent“, call the Find method of the Transform component of its parent.

The example below assumes the script is attached to the parent object (TheParent object):

Because the Transform component of the parent object is already made available within the MonoBehaviour script that’s attached to it, we use “transform” (all lowercase) instead of “Transform” (capitalized).

This makes it so we can call transform.Find right away without having to get the component with the GetComponent method first.

4 Easy Ways to Get Child Objects In Unity

Result

The example above will print out the name of the child object to the console.

Note that this method only works when you know the name of the child object you want. Also, inputting a name of a child object that doesn’t exist will result in the method returning a null value.

4 Easy Ways to Get Child Objects In Unity

Null because can’t find the child object

This method also cannot be used to get a child object of another parent. To do that, you must have a reference to that parent’s Transform component.

How to Get A Child Object of An Object by Its Index in Unity

Sometimes, it’s not always ideal to get child objects by their names if they’re procedurally generated and there are a bunch of them under a parent object.

This is where we get them by the index of their positions instead. This is similar to dealing with arrays.

The example above will print out the name of the child object at index number 0 which is the first child in the hierarchy.

4 Easy Ways to Get Child Objects In Unity

Note that the GetChild method will throw an out-of-bound error if you specify an index that’s bigger than the total number of all the children under the parent.

To combat this, use the childCount property to determine the total number of child objects of the parent object.

The example above gets the last child object of this parent object and prints out its name to the console. The reason we have to subtract one from the count is because the index starts at 0, not 1.

4 Easy Ways to Get Child Objects In Unity

You might notice that the child count returns 4 when there are 5 child objects under the parent object. This is because it only counts the direct child objects.

How to Get Child Objects of An Object in Unity

There are times when you want to access child objects of an object. Unfortunately, Unity doesn’t have an easy method to use to get a list of all children nested under a game object.

But not all hope is lost. We can work around this issue by iterating through all of the child objects using a for-each loop.

It is not documented, but when a Transform is used with a for-each loop, you can loop through all of the direct child objects of that Transform.

The example above will get all of the child objects and store them in a List.

4 Easy Ways to Get Child Objects In Unity

How to Call A Method In All Child Objects of An Object in Unity

There will come a time when you want to execute a command for all of the child objects within a parent object. For example, when you want to iterate through all children of an object and make them execute a function like shoot bullets or explode all at the same time.

Unity has made it quite easy to do this. All you have to do is call the BroadcastMessage method.

This is the parent’s script:

And this script below is attached to each of the child objects:

What BroadcastMessage does is it will execute the method with the specified name in all of the MonoBehaviour scripts of all child objects AND the parent object itself, if there is one.

4 Easy Ways to Get Child Objects In Unity

The BroadcastMessage method can also take a parameter and pass it to the specified method. For more information, see the official documentation.

This is useful when you just want to execute a method of child objects without having to first get them.

Attribution

Diagram icon made by Good Ware from www.flaticon.com

Hi, I'm Pavee. I'm a software developer, an aspiring pixel artist, and the owner of Game Dev Planet. I love learning new things and have a passion for game development.

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

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