Szukaj…


Składnia

  • public static GameObject Find (nazwa ciągu);
  • public static GameObject FindGameObjectWithTag (tag łańcucha);
  • public static GameObject [] FindGameObjectsWithTag (tag łańcucha);
  • public static Object FindObjectOfType (typ typu);
  • public static Object [] FindObjectsOfType (typ typu);

Uwagi

Której metody użyć

Zachowaj ostrożność, szukając GameObjects w czasie wykonywania, ponieważ może to pochłaniać zasoby. W szczególności: nie uruchamiaj FindObjectOfType lub Find in Update, FixedUpdate lub bardziej ogólnie w metodzie zwanej raz lub więcej razy na ramkę.

  • Wywoływanie metod wykonawczych FindObjectOfType i Find tylko w razie potrzeby
  • FindGameObjectWithTag ma bardzo dobrą wydajność w porównaniu do innych metod opartych na łańcuchach. Unity utrzymuje osobne karty na oznaczonych obiektach i odpytuje je zamiast całej sceny.
  • W przypadku „statycznych” obiektów GameObject (takich jak elementy interfejsu użytkownika i prefabrykaty) utworzonych w edytorze należy użyć edytowalnego odniesienia GameObject w edytorze
  • Zachowaj listy GameObjects na liście lub tablicach, którymi sam zarządzasz
  • Ogólnie, jeśli tworzysz wiele GameObjectów tego samego typu, spójrz na Pooling obiektów
  • Przechowuj w pamięci podręcznej wyniki wyszukiwania, aby uniknąć wielokrotnego uruchamiania drogich metod wyszukiwania.

Zejść głębiej

Oprócz metod, które są dostarczane z Unity, stosunkowo łatwo jest zaprojektować własne metody wyszukiwania i gromadzenia.

  • W przypadku FindObjectsOfType() , możesz mieć skrypty przechowujące ich listę w zbiorze static . O wiele szybsze jest iterowanie gotowej listy obiektów niż wyszukiwanie i sprawdzanie obiektów ze sceny.

  • Lub stwórz skrypt, który przechowuje ich instancje w Dictionary opartym na łańcuchach, a masz prosty system znakowania, na którym możesz rozwinąć.

Wyszukiwanie według nazwy GameObject

var go = GameObject.Find("NameOfTheObject");
Plusy Cons
Łatwy w użyciu Wydajność spada wraz z liczbą obiektów w scenie
Ciągi są słabymi referencjami i podejrzewają o błędy użytkownika

Wyszukiwanie według tagów GameObject

var go = GameObject.FindGameObjectWithTag("Player");
Plusy Cons
Możliwe wyszukiwanie zarówno pojedynczych obiektów, jak i całych grup Ciągi są słabymi referencjami i podejrzewają o błędy użytkownika.
Stosunkowo szybki i wydajny Kod nie jest przenośny, ponieważ tagi są na stałe zakodowane w skryptach.

Wstawione do skryptów w trybie edycji

[SerializeField]
GameObject[] gameObjects;
Plusy Cons
Świetny występ Kolekcja obiektów jest statyczna
Kod przenośny Może odnosić się tylko do GameObjects z tej samej sceny

Znajdowanie skryptów GameObjects według MonoBehaviour

ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;

FindObjectOfType() zwraca null jeśli nie zostanie znaleziony.

Plusy Cons
Mocno napisane Wydajność spada wraz z liczbą obiektów gry potrzebnych do oceny
Możliwe wyszukiwanie zarówno pojedynczych obiektów, jak i całych grup

Znajdź obiekty GameObject według nazwy na podstawie obiektów potomnych

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

Find zwraca null jeśli nie zostanie znalezione

Plusy Cons
Ograniczony, dobrze zdefiniowany zakres wyszukiwania Ciągi są słabymi referencjami


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow