unity3d
Encontrar y coleccionar GameObjects
Buscar..
Sintaxis
- Búsqueda de GameObject estática pública (nombre de cadena);
- público estático GameObject FindGameObjectWithTag (etiqueta de cadena);
- GameObject estático público [] FindGameObjectsWithTag (etiqueta de cadena);
- objeto estático público FindObjectOfType (tipo de tipo);
- objeto estático público [] FindObjectsOfType (tipo de tipo);
Observaciones
Qué método utilizar
Tenga cuidado al buscar GameObjects en tiempo de ejecución, ya que esto puede consumir recursos. Especialmente: no ejecute FindObjectOfType o Find in Update, FixedUpdate o más generalmente en un método llamado una o más veces por fotograma.
- Llame a los métodos de ejecución
FindObjectOfType
yFind
solo cuando sea necesario -
FindGameObjectWithTag
tiene un rendimiento muy bueno en comparación con otros métodos basados en cadenas. Unity mantiene pestañas separadas en los objetos etiquetados y las consulta en lugar de toda la escena. - Para GameObjects "estáticos" (como elementos de UI y prefabs) creados en el editor, use la referencia de GameObject serializable en el editor
- Mantenga sus listas de GameObjects en la Lista o Arreglos que usted mismo administra.
- En general, si crea una gran cantidad de GameObjects del mismo tipo, eche un vistazo a la Agrupación de objetos
- Guarda en caché los resultados de búsqueda para evitar ejecutar los métodos de búsqueda costosos una y otra vez.
Yendo mas profundo
Además de los métodos que vienen con Unity, es relativamente fácil diseñar sus propios métodos de búsqueda y recopilación.
En el caso de
FindObjectsOfType()
, puede hacer que sus scripts guarden una lista de ellos mismos en una colecciónstatic
. Es mucho más rápido iterar una lista de objetos lista que buscar e inspeccionar objetos de la escena.O cree un script que almacene sus instancias en un
Dictionary
basado en cadenas, y usted tiene un sistema de etiquetado simple que puede ampliar.
Buscando por nombre de GameObject
var go = GameObject.Find("NameOfTheObject");
Pros | Contras |
---|---|
Fácil de usar | El rendimiento se degrada a lo largo del número de gameobjects en escena |
Las cadenas son referencias débiles y sospechosas de errores del usuario |
Buscando por las etiquetas de GameObject
var go = GameObject.FindGameObjectWithTag("Player");
Pros | Contras |
---|---|
Posibilidad de buscar tanto objetos individuales como grupos enteros | Las cadenas son referencias débiles y sospechosas de errores del usuario. |
Relativamente rápido y eficiente | El código no es portátil, ya que las etiquetas están codificadas en los scripts. |
Insertado a scripts en el modo de edición
[SerializeField]
GameObject[] gameObjects;
Pros | Contras |
---|---|
Gran actuación | La colección de objetos es estática |
Codigo portatil | Solo se puede referir a GameObjects desde la misma escena. |
Encontrando guiones de GameObjects by MonoBehaviour
ExampleScript script = GameObject.FindObjectOfType<ExampleScript>();
GameObject go = script.gameObject;
FindObjectOfType()
devuelvenull
si no se encuentra ninguno.
Pros | Contras |
---|---|
Fuertemente mecanografiado | El rendimiento se degrada a lo largo del número de gameobjects necesarios para evaluar |
Posibilidad de buscar tanto objetos individuales como grupos enteros |
Encuentra GameObjects por nombre de objetos secundarios
Transform tr = GetComponent<Transform>().Find("NameOfTheObject");
GameObject go = tr.gameObject;
Find
devolucionesnull
si no se encuentra ninguna
Pros | Contras |
---|---|
Alcance de búsqueda limitado y bien definido. | Las cuerdas son referencias débiles |