unity3d
GameObjects zoeken en verzamelen
Zoeken…
Syntaxis
- openbare statische GameObject Find (stringnaam);
- openbare statische GameObject FindGameObjectWithTag (string-tag);
- public static GameObject [] FindGameObjectsWithTag (string-tag);
- public static Object FindObjectOfType (Type type);
- public static Object [] FindObjectsOfType (Type type);
Opmerkingen
Welke methode te gebruiken
Wees voorzichtig tijdens het zoeken naar GameObjects tijdens runtime, omdat dit veel bronnen kan kosten. Vooral: voer FindObjectOfType of Find in Update, FixedUpdate of meer in het algemeen niet uit in een methode die een of meer tijd per frame wordt genoemd.
- Runtime-methoden
FindObjectOfType
enFind
alleen wanneer nodig -
FindGameObjectWithTag
heeft zeer goede prestaties in vergelijking met andere op snaren gebaseerde methoden. Unity houdt gescheiden tabbladen bij van getagde objecten en vraagt deze in plaats van de hele scène. - Voor "statische" GameObjects (zoals UI-elementen en prefabs) die in de editor zijn gemaakt, gebruikt u de serializable GameObject-referentie in de editor
- Houd uw lijsten met GameObjects in Lijst of Arrays die u zelf beheert
- Over het algemeen, als u veel GameObjects van hetzelfde type instantieert, kijk dan eens naar Object Pooling
- Cache uw zoekresultaten om te voorkomen dat u de dure zoekmethoden steeds opnieuw uitvoert.
Dieper gaan
Naast de methoden die bij Unity worden geleverd, is het relatief eenvoudig om uw eigen zoek- en verzamelmethoden te ontwerpen.
In het geval van
FindObjectsOfType()
kunt u ervoor zorgen dat uw scripts een lijst van zichzelf bijhouden in eenstatic
verzameling. Het is veel sneller om een kant-en-klare lijst met objecten te doorlopen dan om objecten uit de scène te zoeken en te inspecteren.Of maak een script dat hun instanties opslaat in een stringgebaseerd
Dictionary
, en je hebt een eenvoudig tagging-systeem dat je kunt uitbreiden.
Zoeken op naam van GameObject
var go = GameObject.Find("NameOfTheObject");
Pros | Cons |
---|---|
Makkelijk te gebruiken | De prestaties nemen af met het aantal gameobjecten in scène |
Tekenreeksen zijn zwakke verwijzingen en verdacht op gebruikersfouten |
Zoeken op tags van GameObject
var go = GameObject.FindGameObjectWithTag("Player");
Pros | Cons |
---|---|
Mogelijk om zowel afzonderlijke objecten als hele groepen te doorzoeken | Tekenreeksen zijn zwakke verwijzingen en verdacht op gebruikersfouten. |
Relatief snel en efficiënt | Code is niet overdraagbaar omdat tags hard zijn gecodeerd in scripts. |
Ingevoegd in scripts in de bewerkingsmodus
[SerializeField]
GameObject[] gameObjects;
Pros | Cons |
---|---|
Goed optreden | Objectverzameling is statisch |
Draagbare code | Kan alleen verwijzen naar GameObjects uit dezelfde scène |
GameObjects vinden door MonoBehaviour-scripts
ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;
FindObjectOfType()
retourneertnull
als er geen is gevonden.
Pros | Cons |
---|---|
Sterk getypt | De prestaties nemen af met het aantal gameobjecten dat nodig is om te evalueren |
Mogelijk om zowel afzonderlijke objecten als hele groepen te doorzoeken |
Zoek GameObjects op naam uit onderliggende objecten
Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;
Find
retourneertnull
als er geen is gevonden
Pros | Cons |
---|---|
Beperkte, goed gedefinieerde zoekbereik | Strings zijn zwakke referenties |