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