Поиск…


Синтаксис

  • 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
Сильно напечатан Производительность ухудшается по количеству игровых объектов, необходимых для оценки
Возможность поиска как отдельных объектов, так и целых групп

Найти GameObjects по имени из дочерних объектов

Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;

Find возвращает null если ни один не найден

Pros Cons
Ограниченная, четко определенная область поиска Строки - слабые ссылки


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow