unity3d
Znajdowanie i zbieranie GameObjects
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
iFind
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 zbiorzestatic
. 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()
zwracanull
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
zwracanull
jeśli nie zostanie znalezione
Plusy | Cons |
---|---|
Ograniczony, dobrze zdefiniowany zakres wyszukiwania | Ciągi są słabymi referencjami |