Приветствую Вас, дорогие разработчики. В данной статье мы научимся искать игровые объекту по его имени, и по тегу. Ведь при разработке игр нам довольно часто нужно находить игровые объекты, для дальнейшего выполнения каких-либо действий. Приступим сразу к делу.
Поиск объекта по имени
Для того, чтобы найти объект по его имени, необходимо воспользоваться методом GameObject.Find. Посмотрим реализацию данного метода на примере:
public GameObject obj;
void Awake()
{
obj = GameObject.Find("NameGameObject");
}
Обратите внимание, что в первой строке мы создали переменную obj, чтобы в ней хранить ссылку на игровой объект. А в пятой строке, воспользовавшись методом GameObject.Find, получили сам объект по его имени.
Поиск объекта по тегу
Теперь давайте получим ссылку на наш объект по тегу. Для этого воспользуемся методом GameObject.FindGameObjectWithTag:
public GameObject obj;
void Awake()
{
obj = GameObject.FindGameObjectWithTag("TagName");
}
Как видите, смысл такой же, как и в предыдущем примере. Всё очень просто. Только не забудьте указать тег для Вашего объекта, перед запуском данного скрипта. Иначе объект найден не будет.
Важно: Если в Вашей сцене находится несколько объектов с одинаковыми тегами, то метод GameObject.FindGameObjectWithTag найдёт только самый первый объект. Поэтому, существует ещё один способ, который позволит найти все объекты по указанному тегу.
Поиск массива объектов по тегу
Чтобы найти массив объектов по тегу, воспользуемся методом GameObject.FindGameObjectsWithTag. Вы наверное обратили внимание, что название данного меотда почти 1 в 1 схоже с предыдущим методом, за исключением добавленной быквы s в середине названия.
Рассмотрим пример использования метода GameObject.FindGameObjectsWithTag:
public GameObject[] obj;
void Awake()
{
obj = GameObject.FindGameObjectsWithTag("TagName");
}
Обратите внимание, что при использовании метода GameObject.FindGameObjectsWithTag, в первой строке мы должны оказать, что нам нужен массив объектов, при помощи квадратных скобок [].
In this article, we will see, How to find gameobject at runtime in unity using C#. I will explain each and every ways of finding game objects at runtime. So if you are interested then let’s begin.
Introduction
There are different ways to find gameobject at runtime in unity, We are gonna cover all of those ways in this article, So let’s start.
So first we will look at what are the actual ways to find gameobject at runtime in unity. So There are several ways of finding gameobject at runtime
- Gameobject.Find.
- Resources.FindObjectsOfTypeAll.
- Find gameobject with tag.
- Transform.Find.
- transform.GetChild.
For instance, We will find this gameobject (shown in the image below) In different ways.
As you can see in the above image I have highlighted the “Destroy Obj” Gameobject, And we will be finding this gameobject through this article in different-different ways. So let’s start with our first way of finding gameobject at runtime.
First, we will see how to find gameobject with Gameobject.Find(“”).
1. Find gameobject with Gameobject.Find
The first way to find gameobject at runtime in unity is the Gameobject.Find. In order to find our gameobject called “Destroy Obj”, Here is a simple code:
private void Start()
{
GameObject objectToDestroy = GameObject.Find("Destroy Obj");
}
Here I have used this code in the Start function but you can use it where ever you need it, But if possible always try to do it in Start, Awake and OnEnable Function and try to avoid it using in loops or Update Function.
Note :- It will only work if the object that we are finding is active in the hierarchy, If your gameobject is not active in the hierarchy and you want to find it at runtime then you can try the other methods shown below.
But this way to find gameobject at runtime in unity is heavy when you use it in Update method, So try to always use in Start method and take a reference of it in variable and use it wherever you want it.
2. Resources.FindObjectsOfTypeAll
This function can return any type of Unity object that is loaded, including game objects, prefabs, materials, meshes, textures, etc. It will also list internal objects, therefore be careful with the way you handle the returned objects.
So through Resources.FindObjectsOfTypeAll you can also find the list of disabled objects in the scene as well. So here is the simple code of it.
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class ExampleScript : MonoBehaviour
{
List<GameObject> GetAllObjectsOnlyInScene()
{
List<GameObject> objectsInScene = new List<GameObject>();
foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[])
{
if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))
objectsInScene.Add(go);
}
return objectsInScene;
}
}
This will return all GameObjects in the scene, in List<GameObject> format even if gameobject is disabled.
So this is the another way to find gameobject at runtime in unity.
3. Find gameobject with tag
In this way, You can find the gameobject with tags like “Player” or “Enemy”. Returns one active GameObject tagged with the tag you are looking for. Returns null if no GameObject was found.
Tags must be declared in the tag manager before using them. A UnityException will be thrown if the tag does not exist or an empty string or null is passed as the tag.
Here is the code for finding gameobject with tag.
private void Start()
{
GameObject objectToDestroy = GameObject.FindWithTag("Bullet");
Debug.Log(objectToDestroy.name, objectToDestroy);
}
In the place of “Bullet”, You must replace it with your tag. It won’t find if gameobject is disabled.
4. Transform.Find()
This API will return the transform of the child transform or null if no child will be found. In this way, you can also find disabled gameobject in unity.
GameObject gun = player.transform.Find("Gun").gameObject;
You can also find the child of the child, For instance:-
Let’s say you want to find the “Cube3” (Highlighted with Blue) and your transform is “Cube” (Highlighted with Red). So It is possible through the ‘/’ character, It will access the Transform in the hierarchy like a pathname. Here is the example code
GameObject cube3 = transform.Find("@Cube (single mesh)/Cube3").gameObject;
This example is according to the image attached above. This way you can find the disabled gameobjects in unity.
5. transform.GetChild(Index)
This is used when we want to get a child by index and it returns a transform of a child by index.
If the transform has no child, or the index argument has a value greater than the number of children then an error will be generated. In this case “Transform child out of bounds” error will be given. The number of children can be provided by childcount.
Let’s see an example of transform.GetChild(). Let’s take the above image example that we used in transform.Find(). So we want to find “Cube 3” again.
So here is the simple code of it.
GameObject cube3 = transform.GetChild(0).GetChild(2).gameObject;
So this is also the great way to find gameobject at runtime in unity.
You can check this in the above image and match the indexes.
So these are the Ways to find gameobject at runtime in unity. And if you know any other way to find gameobject at runtime in unity, So I will be glad if you share that in the comment section below.
Hope guys this was helpful and may have learned something new today, Stay tuned for new topics.
So what way you prefer to find gameobject at runtime? Comment down
If you have an issue or query you can contact me. Thank You.
Finding and referencing a game object properly in Unity3D is one of the most asked questions for those who are new to Unity3D. In this article, I will write about referencing game objects, finding them according to their names, tags, and types. But let me give you the answer to the question at the title briefly.
In Unity3D, we can find game objects according to their names, tags, and types. For these purposes, we use the following methods respectively: GameObject.Find( ), GameObject.FindWithTag( ) and Object.FindObjectOfType(). These methods will return only one game object. Additionally, it is also possible to find all the game objects that have the same tag or are in the same type, using GameObject.FindGameObjectsWithTag( ) and Object.FindObjectsOfType( ). These methods will return arrays of game objects.
Contents
- Referencing game objects in Unity3D
- What is referencing?
- How do you reference a game object in Unity3D?
- How to find game objects by their names
- Finding a game object that has a specific tag
- Getting the array of all game objects that have the same tag
- Finding a game object that matches a specific type
- Getting the array of all game objects that matches a specific type
- How to find a child game object
- Further remarks
Referencing game objects in Unity3D
What is referencing?
Most of the time, we want to access other game objects and their components. Hence, we can gather information about them when it is required, send information to them, control their behaviors, or execute a method that is in a script that is attached to them. In these cases, we need an address(or let’s say a phone number) of the game object and thus, we can dial whenever we want. This is called referencing.
While developing games in Unity3D, we always reference other game objects or components. Therefore, this is a fundamental topic you should understand before you go further.
How to create references to game objects or components
First of all, we have to declare variables that will store the address of the game objects or components. And hence, whenever we would like to access the properties of these game objects or components, we use these variables.
GameObject myGameObject; GameObject herGameObject; GameObject hisGameObject;
In the code above, we declared two variables in type GameObject but we have not assigned any object them yet. You may consider this as if we are reserving empty rows in an address book that we will fill them out later.
To reference these variables, we have a couple of options. We can search the game object that we want to assign using built-in methods that are included in Unity. We will see this option in later sections of this article. Another option is to assign relevant game objects directly in the Unity editor. But to do this we have to declare the objects either public or private with [SerializeField] attribute.
GameObject myGameObject; public GameObject herGameObject; [SerializeField]private GameObject hisGameObject;
In the code above, the first variable is declared as private(you can put the private keyword in front of it as well if you want), the second variable is declared as public and the third variable is declared as private with [SerializeField] attribute. [SerializeField] attribute makes this variable visible in the editor but still inaccessible from other scripts.
Now, you can drag and drop the game objects, that you would like to assign, to the slots that are visible in the inspector.
If you would like to create references to the components that are associated with the game objects, you need to declare variables that are in the type of that component.
Rigidbody rigidbodyComponent; BoxCollider boxColliderComponent;
How to find game objects by their names
As I mentioned above, we can create references to game objects and components by searching and finding them using built-in methods in Unity. This is useful especially when you want to stay the variable private or when you want to access an object that is created during runtime.
In order to search for a game object that has a specific name in the scene, we have to use the method GameObject.Find( ). It takes a string parameter. And this parameter is the name of the game object that we want to find.
myGameObject = GameObject.Find("Sphere");
In the code above, we created a reference for the game object that has the name “Sphere”.
If you would like to access a component that is attached to this game object, you should create a reference for that component. For instance, the following creates a reference for a rigidbody component that is attached to this game object, and hence you can access the properties of this component.
rigidbodyComponent = GameObject.Find("Sphere").GetComponent<Rigidbody>();
Finding a game object that has a specific tag
In addition to finding an object by its name, we can also find it by its tag which we are able to determine objects in the scene.
To find a game object that has a specific tag, we use the method GameObject.FindWithTag( ). This method takes a string parameter and searches for it (There is one more method that does the same job. You can also use GameObject.FindGameObjectWithTag( ) for the same purpose).
myGameObject = GameObject.FindWithTag("Player");
A tag can be used either for only one object or multiple objects. If there is more than one object that has the same tag, this method returns only one of them.
Getting the array of all game objects that have the same tag
If there are multiple objects that have the same tag and we want to get them all, we need to use the method GameObject.FindGameObjectsWithTag( ). Likewise, this method also takes a string parameter and returns an array of all game objects. Therefore, we have to declare an array that will store the game objects.
GameObject[] cubes;
The following returns and assigns all objects that have the tag “Cube”.
cubes = GameObject.FindGameObjectsWithTag("Cube");
Finding a game object that matches a specific type
We can also search and find a game object that matches a specific type. In other words, for instance, we can get a game object or component that has a specific component. To do this, we use the method Object.FindObjectOfType( ). This method also returns only one of the objects.
The following one finds a light component and creates a reference to it.
Light mainLight = (Light)FindObjectOfType(typeof(Light));
Getting the array of all game objects that match a specific type
If there are multiple game objects that match a specific type, we can find all of them and create references in an array. For this purpose, we use the method Object.FindObjectsOfType( ). This is an example of how we use it:
var sphereCollider = FindObjectsOfType(typeof(SphereCollider));
How to find a child game object
In order to find a child object and create a reference to that child object we can use the method Transform.Find( ). This method takes a string parameter and returns the child game object that the name matches this parameter.
Assume that there is a game object in the scene that has a tag “Player”. And also assume that this player object has a child game object which has the name “Gun”. If we want to create a reference for the “Gun” object, we may do this as the following:
GameObject gun=GameObject.FindWithTag("Player").transform.Find("Gun");
This is useful especially if there are multiple objects that has the same name under different objects.
Further remarks
In this article, we see different ways of how we reference game objects in Unity3D. Here, I need to warn you that searching and finding methods are extremely slow and you should avoid using them in Update, FixedUpdate, or LateUpdate methods, if possible. We generally use them in Start or Awake methods. You may also consider creating references in Singleton’s to improve performances. We have various tutorials about the Unity3D Engine that you can see in this link.
Задать вопрос
@UnityMakar
-
Unity
Здравствуйте!
Мне нужна помощь. Мне нужна функция которая на сцене будет находить объект по определённым параметрам(например название).
Заранее спасибо.
-
Вопрос заданболее трёх лет назад
-
9486 просмотров
Комментировать
Подписаться
1
Простой
Комментировать
Решения вопроса 0
Пригласить эксперта
Ответы на вопрос 2
@flexer1992
Unity Developer
Это вам в документацию)
Ответ написан
более трёх лет назад
Комментировать
Комментировать
@TailsMiles54
Если по имени то GameObject.Find();
Есть ещё поиск среди дочерних объектов, а можно искать по тегу GameObject.FindWithTag
В любом случае как сказали выше читай доки
https://docs.unity3d.com/ScriptReference/GameObjec…
Ответ написан
более трёх лет назад
Комментировать
Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
Войти через центр авторизации
Похожие вопросы
-
-
Unity
Простой
Как убрать исчезновение объекта при вращении камеры?
-
1 подписчик -
час назад
-
10 просмотров
0
ответов
-
-
-
Unity
- +1 ещё
Простой
Почему объект не поворачивается в unity 2d?
-
2 подписчика -
17 часов назад
-
33 просмотра
1
ответ
-
-
-
C#
- +1 ещё
Простой
Как сделать генерацию высот ландшафта?
-
1 подписчик -
20 часов назад
-
30 просмотров
1
ответ
-
-
-
Unity
Средний
Как спроецировать объект на плоскость правильно?
-
2 подписчика -
вчера
-
63 просмотра
0
ответов
-
-
-
Unity
Простой
Как довести до ума код?
-
1 подписчик -
вчера
-
61 просмотр
1
ответ
-
-
-
Unity
- +1 ещё
Простой
Почему не запускается unity без интернета?
-
1 подписчик -
вчера
-
50 просмотров
0
ответов
-
-
-
Unity
Простой
Как сделать лучи паралельными?
-
1 подписчик -
вчера
-
25 просмотров
1
ответ
-
-
-
Unity
Средний
Как сделать луч который будет реагировать на триггеры?
-
2 подписчика -
17 мая
-
62 просмотра
1
ответ
-
-
-
Unity
Простой
Куда делся и чем заменить Multiplayer Hlapi?
-
1 подписчик -
17 мая
-
30 просмотров
1
ответ
-
-
-
Unity
Простой
Почему нет кнопки 1 в настройках джойстика System?
-
1 подписчик -
17 мая
-
13 просмотров
0
ответов
-
-
Показать ещё
Загружается…
Вакансии с Хабр Карьеры
Senior / Lead Flutter Developer в мобильный проект
URSO
от 3 500 $
Тестировщик
Bell Integrator
•
Калининград
от 50 000 до 65 000 ₽
AppSec Tech Lead (Senior)
Сбер
•
Москва
от 250 000 до 350 000 ₽
Ещё вакансии
Заказы с Хабр Фриланса
PostgreSQL написать запросы
20 мая 2023, в 13:15
500 руб./за проект
Необходимо разработать одностраничный сайт
20 мая 2023, в 13:10
500 руб./за проект
Разработать простую сетевую игру С++/С#
20 мая 2023, в 12:56
1500 руб./за проект
Ещё заказы
Минуточку внимания
Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями
Зарегистрироваться
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации
Синтаксис
- public static GameObject Find (имя строки);
- public static GameObject FindGameObjectWithTag (строковый тег);
- public static GameObject [] FindGameObjectsWithTag (строковый тег);
- public static Object FindObjectOfType (тип типа);
- public static Object [] FindObjectsOfType (Тип типа);
замечания
Какой метод использовать
Будьте осторожны при поиске GameObjects во время выполнения, поскольку это может быть ресурсоемким. В частности: не запускайте FindObjectOfType или найдите в Update, FixedUpdate или, в более общем плане, в методе, называемом одним или несколькими моментами на кадр.
- Вызовите методы выполнения
FindObjectOfType
иFind
только в случае необходимости -
FindGameObjectWithTag
имеет очень хорошую производительность по сравнению с другими методами на основе строк. Unity хранит отдельные вкладки на помеченных объектах и запрашивает их вместо всей сцены. - Для «статических» GameObjects (таких как элементы пользовательского интерфейса и сборные файлы), созданных в редакторе, используйте сериализуемую ссылку GameObject в редакторе
- Храните свои списки GameObjects в списке или массивах, которыми вы управляете сами
- В общем случае, если вы создаете экземпляр множества GameObjects того же типа, взгляните на Object Pooling
- Кэш ваших результатов поиска, чтобы избежать дорогостоящих методов поиска снова и снова.
Идти глубже
Помимо методов, которые приходят с Unity, относительно легко разработать собственные методы поиска и сбора.
-
В случае
FindObjectsOfType()
вас могут быть ваши скрипты, которые хранят список вstatic
коллекции. Гораздо быстрее перебирать готовый список объектов, чем искать и проверять объекты со сцены. -
Или создайте скрипт, который хранит их экземпляры в
Dictionary
основе строк, и у вас есть простая система тегов, которую вы можете расширить.
Поиск по названию GameObject
var go = GameObject.Find("NameOfTheObject");
Pros | Cons |
---|---|
Легко использовать | Производительность ухудшается по количеству игровых объектов в сцене |
Строки – это слабые ссылки и подозрения на ошибки пользователя |
Поиск по тегам GameObject
var go = GameObject.FindGameObjectWithTag("Player");
Pros | Cons |
---|---|
Возможность поиска как отдельных объектов, так и целых групп | Строки – это слабые ссылки и подозрения на ошибки пользователя. |
Относительно быстрый и эффективный | Код не переносится, поскольку теги жестко закодированы в сценариях. |
Вставка в сценарии в режиме редактирования
[SerializeField]
GameObject[] gameObjects;
Pros | Cons |
---|---|
Отличное выступление | Коллекция объектов статическая |
Портативный код | Может ссылаться только на GameObjects с той же сцены |
Поиск GameObjects с помощью скриптов MonoBehaviour
ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;
FindObjectOfType()
возвращаетnull
если ни один не найден.
Pros | Cons |
---|---|
Сильно напечатан | Производительность ухудшается по количеству игровых объектов, необходимых для оценки |
Возможность поиска как отдельных объектов, так и целых групп |
Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;
Find
возвращаетnull
если ни один не найден
Pros | Cons |
---|---|
Ограниченная, четко определенная область поиска | Строки – слабые ссылки |