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
FindObjectOfTypeenFindalleen wanneer nodig -
FindGameObjectWithTagheeft 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 eenstaticverzameling. 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()retourneertnullals 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;
Findretourneertnullals er geen is gevonden
| Pros | Cons |
|---|---|
| Beperkte, goed gedefinieerde zoekbereik | Strings zijn zwakke referenties |