unity3d
Hitta och samla GameObjects
Sök…
Syntax
- public static GameObject Find (strängnamn);
- public static GameObject FindGameObjectWithTag (strängtagg);
- public static GameObject [] FindGameObjectsWithTag (strängtagg);
- offentligt statiskt objekt FindObjectOfType (typstyp);
- offentligt statiskt objekt [] FindObjectsOfType (typstyp);
Anmärkningar
Vilken metod du ska använda
Var försiktig när du letar efter GameObjects under körning, eftersom det kan vara resurskrävande. Speciellt: kör inte FindObjectOfType eller Find in Update, FixedUpdate eller mer generellt i en metod som kallas en eller flera tid per ram.
- Ring runtime-metoder
FindObjectOfType
ochFind
endast vid behov -
FindGameObjectWithTag
har mycket bra prestanda jämfört med andra strängbaserade metoder. Enhet håller separata flikar på taggade objekt och frågar sådana istället för hela scenen. - För "statiska" GameObjects (t.ex. UI-element och prefaber) som skapats i redigeraren använder du serienummerbar GameObject-referens i redigeraren
- Förvara dina listor över GameObjects i listan eller Arrays som du hanterar själv
- Om du genererar en hel del GameObjects av samma typ kan du titta på Object Pooling
- Cache dina sökresultat för att undvika att köra de dyra sökmetoderna om och om igen.
Gå djupare
Förutom de metoder som följer med Unity är det relativt enkelt att designa dina egna sök- och insamlingsmetoder.
Vid
FindObjectsOfType()
kan du låta dina skript hålla en lista över sig själva i enstatic
samling. Det är mycket snabbare att upprepa en klar lista över objekt än att söka och inspektera objekt från scenen.Eller skapa ett skript som lagrar sina instanser i en strängbaserad
Dictionary
, och du har ett enkelt märkningssystem du kan utöka på.
Sök efter GameObject-namn
var go = GameObject.Find("NameOfTheObject");
Fördelar | Nackdelar |
---|---|
Lätt att använda | Prestanda försämras efter antalet spelobjekt i scenen |
Strängar är svaga referenser och misstänker användarfel |
Söka efter GameObject-taggar
var go = GameObject.FindGameObjectWithTag("Player");
Fördelar | Nackdelar |
---|---|
Möjligt att söka både i enstaka objekt och i hela grupper | Strängar är svaga referenser och misstänker användarfel. |
Relativt snabbt och effektivt | Koden är inte bärbar eftersom taggar är hårdkodade i skript. |
Infogats till skript i redigeringsläge
[SerializeField]
GameObject[] gameObjects;
Fördelar | Nackdelar |
---|---|
Bra resultat | Objektsamling är statisk |
Bärbar kod | Kan bara hänvisa till GameObjects från samma scen |
Hitta GameObjects av MonoBehaviour-skript
ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;
FindObjectOfType()
returnerarnull
om ingen hittas.
Fördelar | Nackdelar |
---|---|
Starkt typad | Prestanda försämras med antalet spelobjekt som behövs för att utvärdera |
Möjligt att söka både i enstaka objekt och i hela grupper |
Hitta GameObjects efter namn från barnobjekt
Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;
Find
returnerarnull
om ingen hittas
Fördelar | Nackdelar |
---|---|
Begränsad, väl definierad sökomfång | Strängar är svaga referenser |