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