Как найти объект по названию unity

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Your name

Your email

Suggestion*

Cancel

Switch to Manual

Declaration

public static GameObject Find(string name);

Description

Finds a GameObject by name and returns it.

This function only returns active GameObjects. If no GameObject with name can be found, null is returned. If name contains a ‘/’ character, it traverses the hierarchy like a path name.

For performance reasons, it is recommended to not use this function every frame. Instead, cache the result in a member variable at startup. or use GameObject.FindWithTag.

Note: If you wish to find a child GameObject, it is often easier to use Transform.Find.

Note: If the game is running with multiple scenes then Find will search in all of them.

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

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

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

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.

Как найти объект по названию?

Как найти объект по названию?

Мне нужно чтобы Transform target стал равен Transform с именем leftTarget, но известно, что этот leftTarget находится в Transform army, сам leftTarget находится глубоко в иерархии.Как можно такое реализовать? Но чтобы динамически обновляло target, т.к. leftTarget меняется.

ruswizz
UNITрон
 
Сообщения: 195
Зарегистрирован: 11 май 2013, 12:32

Re: Как найти объект по названию?

Сообщение Левш@ 25 дек 2014, 21:19

Как можно такое реализовать?

Используется csharp

Transform target;

void Update () {
        GameObject obj = GameObject.Find(“leftTarget”) as GameObject;
        target = obj.transform;
}

Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Как найти объект по названию?

Сообщение OlegNick 26 дек 2014, 00:57

ruswizz писал(а): т.к. leftTarget меняется.

В смысле меняется, то жиреет то худеет? если меняется Object.name вашего target то :

Используется csharp

   

public Transform army;
    public Transform target;

    void Update()
    {
        if (!target || target.name != “leftTarget”)
            target = army.Find(“leftTarget”);
    }

Усложнять – просто, упрощать – сложно.

OlegNick
Старожил
 
Сообщения: 585
Зарегистрирован: 10 ноя 2013, 02:21
Откуда: Россия, Калуга

Re: Как найти объект по названию?

Сообщение ruswizz 26 дек 2014, 04:40

Левш@, Olegnick спасибо. Но разве таким способом не будет фпс падать? Через GameObject.FindWithTag будет лучше?

ruswizz
UNITрон
 
Сообщения: 195
Зарегистрирован: 11 май 2013, 12:32

Re: Как найти объект по названию?

Сообщение ruswizz 26 дек 2014, 04:42

OlegNick писал(а):

ruswizz писал(а): т.к. leftTarget меняется.

В смысле меняется, то жиреет то худеет? если меняется Object.name вашего target то :

Используется csharp

   

public Transform army;
    public Transform target;

    void Update()
    {
        if (!target || target.name != “leftTarget”)
            target = army.Find(“leftTarget”);
    }

Хотя у вас правильно реализовано. Спасибо еще раз.

ruswizz
UNITрон
 
Сообщения: 195
Зарегистрирован: 11 май 2013, 12:32

Re: Как найти объект по названию?

Сообщение ruswizz 28 дек 2014, 10:09

Левш@ писал(а):

Как можно такое реализовать?

Используется csharp

Transform target;

void Update () {
        GameObject obj = GameObject.Find(“leftTarget”) as GameObject;
        target = obj.transform;
}

Реализовал как у вас, думал все отлично, но оказывается ищет во всей сцене. Писал вот так:

Используется csharp

GameObject obj = army.Find(“L_Grip”) as GameObject;

Не хочет искать именно в army. В чем проблема?

ruswizz
UNITрон
 
Сообщения: 195
Зарегистрирован: 11 май 2013, 12:32


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5



Синтаксис

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

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