Как найти объекты на сцене unity

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

Поиск объекта по имени

Для того, чтобы найти объект по его имени, необходимо воспользоваться методом 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

  1. Gameobject.Find.
  2. Resources.FindObjectsOfTypeAll.
  3. Find gameobject with tag.
  4. Transform.Find.
  5. transform.GetChild.

For instance, We will find this gameobject (shown in the image below) In different ways.

Find Gameobjects At Runtime In Unity C#
Find Gameobjects At Runtime In Unity C#

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:-

Find Gameobjects At Runtime Through Transform.Find()
Find Gameobjects At Runtime Through Transform.Find()

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.

Задать вопрос

UnityMakar

@UnityMakar

unity

  • Unity

Здравствуйте!
Мне нужна помощь. Мне нужна функция которая на сцене будет находить объект по определённым параметрам(например название).
Заранее спасибо.


  • Вопрос задан

    более трёх лет назад

  • 9518 просмотров


Комментировать

Подписаться

1



Простой

Комментировать


Решения вопроса 0

Пригласить эксперта


Ответы на вопрос 2

flexer1992

Alex Maximovich

@flexer1992

Unity Developer

Это вам в документацию)

Ответ написан

более трёх лет назад


Комментировать


Комментировать

TailsMiles54

@TailsMiles54

Если по имени то GameObject.Find();
Есть ещё поиск среди дочерних объектов, а можно искать по тегу GameObject.FindWithTag

В любом случае как сказали выше читай доки
https://docs.unity3d.com/ScriptReference/GameObjec…

Ответ написан

более трёх лет назад


Комментировать


Комментировать


Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации


Похожие вопросы

  • c#

    • C#

    • +1 ещё




    Простой

    Как изменить уровень совместимости API на .NET 4.x в Unity 2021.3.25?


    • 1 подписчик
    • вчера


    • 29 просмотров

    0

    ответов

  • unity

    • Unity




    Простой

    Что делать если при просмотре игры вылезает ошибка такого типа?


    • 1 подписчик
    • вчера


    • 33 просмотра

    1

    ответ

  • c#

    • C#

    • +1 ещё




    Средний

    Как сделать смену прозрачности в зависимости от расстояния?


    • 1 подписчик
    • 20 мая


    • 30 просмотров

    1

    ответ

  • unity

    • Unity




    Простой

    Как убрать исчезновение объекта при вращении камеры?


    • 1 подписчик
    • 20 мая


    • 13 просмотров

    0

    ответов

  • unity

    • Unity

    • +1 ещё




    Простой

    Почему объект не поворачивается в unity 2d?


    • 2 подписчика
    • 19 мая


    • 38 просмотров

    1

    ответ

  • c#

    • C#

    • +1 ещё




    Простой

    Как сделать генерацию высот ландшафта?


    • 1 подписчик
    • 19 мая


    • 45 просмотров

    1

    ответ

  • unity

    • Unity




    Средний

    Как спроецировать объект на плоскость правильно?


    • 2 подписчика
    • 19 мая


    • 70 просмотров

    0

    ответов

  • unity

    • Unity




    Простой

    Как довести до ума код?


    • 1 подписчик
    • 18 мая


    • 67 просмотров

    1

    ответ

  • unity

    • Unity

    • +1 ещё




    Простой

    Почему не запускается unity без интернета?


    • 1 подписчик
    • 18 мая


    • 54 просмотра

    0

    ответов

  • unity

    • Unity




    Средний

    Как сделать луч который будет реагировать на триггеры?


    • 2 подписчика
    • 17 мая


    • 67 просмотров

    1

    ответ


  • Показать ещё
    Загружается…

Вакансии с Хабр Карьеры

Senior / Lead Flutter Developer в мобильный проект

URSO

от 3 500 $

Руководитель / TeamLead команды разработки

Дорожная Сеть

Москва

от 250 000 ₽

Менеджер отдела продаж

media5

Москва

от 150 000 ₽

Ещё вакансии

Заказы с Хабр Фриланса

Мобильное приложение на Flutter

23 мая 2023, в 11:56

250000 руб./за проект

C# доработка бекенда социального веб-приложения

23 мая 2023, в 11:54

12000 руб./за проект

Разработать лендинг и провести комплексную рекламную компанию

23 мая 2023, в 11:12

15000 руб./за проект

Ещё заказы

Минуточку внимания

Присоединяйтесь к сообществу, чтобы узнавать новое и делиться знаниями

Зарегистрироваться

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.

Войти через центр авторизации

How to find gameobjects in Unity3D

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.

Referencing in unity editor

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.

Finding a game object that has a specific tag

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.

Синтаксис

  • 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
Ограниченная, четко определенная область поиска Строки – слабые ссылки

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