unity3d
Etiquetas
Buscar..
Introducción
Una etiqueta es una cadena que se puede aplicar para marcar tipos de GameObject
. De esta manera, facilita la identificación de objetos GameObject
particulares a través del código.
Se puede aplicar una etiqueta a uno o más objetos del juego, pero un objeto del juego siempre tendrá una sola etiqueta. De forma predeterminada, la etiqueta "Sin etiquetar " se usa para representar un GameObject
que no se ha etiquetado intencionalmente.
Creación y aplicación de etiquetas
Las etiquetas se aplican típicamente a través del editor; Sin embargo, también puede aplicar etiquetas a través de script. Cualquier etiqueta personalizada debe crearse a través de la ventana Etiquetas y Capas antes de aplicarse a un objeto de juego.
Estableciendo etiquetas en el editor
Con uno o más objetos de juego seleccionados, puede seleccionar una etiqueta del inspector. Los objetos del juego siempre llevarán una sola etiqueta; de forma predeterminada, los objetos del juego se etiquetarán como "Sin etiquetar " . También puede moverse a la ventana Etiquetas y capas seleccionando "Agregar etiqueta ..." ; sin embargo, es importante tener en cuenta que esto solo lo lleva a la ventana Etiquetas y capas . Cualquier etiqueta que crees no se aplicará automáticamente al objeto del juego.
Configuración de etiquetas a través de secuencias de comandos
Puede cambiar directamente una etiqueta de objetos del juego a través del código. Es importante tener en cuenta que debe proporcionar una etiqueta de la lista de etiquetas actuales; Si proporciona una etiqueta que aún no se ha creado, se producirá un error.
Como se detalla en otros ejemplos, el uso de una serie de variables de static string
en lugar de escribir manualmente cada etiqueta puede garantizar la consistencia y confiabilidad.
La siguiente secuencia de comandos demuestra cómo podemos cambiar una serie de etiquetas de objetos del juego, utilizando referencias de static string
para garantizar la coherencia. Tenga en cuenta la suposición de que cada static string
representa una etiqueta que ya se ha creado en la ventana Etiquetas y capas .
using UnityEngine;
public class Tagging : MonoBehaviour
{
static string tagUntagged = "Untagged";
static string tagPlayer = "Player";
static string tagEnemy = "Enemy";
/// <summary>Represents the player character. This game object should
/// be linked up via the inspector.</summary>
public GameObject player;
/// <summary>Represents all the enemy characters. All enemies should
/// be added to the array via the inspector.</summary>
public GameObject[] enemy;
void Start ()
{
// We ensure that the game object this script is attached to
// is left untagged by using the default "Untagged" tag.
gameObject.tag = tagUntagged;
// We ensure the player has the player tag.
player.tag = tagUntagged;
// We loop through the enemy array to ensure they are all tagged.
for(int i = 0; i < enemy.Length; i++)
{
enemy[i].tag = tagEnemy;
}
}
}
Creación de etiquetas personalizadas
Independientemente de si establece etiquetas a través del Inspector, o mediante un script, las etiquetas deben declararse a través de la ventana Etiquetas y Capas antes de usarlas. Puede acceder a esta ventana seleccionando "Agregar etiquetas ..." en el menú desplegable de etiquetas de objetos del juego. Alternativamente, puede encontrar la ventana en Editar> Configuración del proyecto> Etiquetas y capas .
Simplemente seleccione el botón + , ingrese el nombre deseado y seleccione Guardar para crear una etiqueta. Al seleccionar el botón - eliminará la etiqueta resaltada en ese momento. Tenga en cuenta que de esta manera, la etiqueta se mostrará inmediatamente como "(Eliminada)" , y se eliminará por completo cuando se vuelva a cargar el proyecto.
Seleccionar el engranaje / engranaje desde la parte superior derecha de la ventana le permitirá restablecer todas las opciones personalizadas. Esto eliminará de inmediato todas las etiquetas personalizadas, junto con cualquier capa personalizada que pueda tener en "Ordenar capas" y "Capas" .
Encontrar GameObjects por etiqueta:
Las etiquetas hacen que sea particularmente fácil localizar objetos específicos del juego. Podemos buscar un solo objeto de juego, o buscar múltiples.
Encontrar un solo objeto de GameObject
Podemos usar la función estática GameObject.FindGameObjectWithTag(string tag)
para buscar objetos individuales del juego. Es importante tener en cuenta que, de esta manera, los objetos del juego no se consultan en ningún orden en particular. Si busca una etiqueta que se utiliza en varios objetos del juego en la escena, esta función no podrá garantizar qué objeto del juego se devuelve. Como tal, es más apropiado cuando sabemos que solo un objeto del juego usa dicha etiqueta, o cuando no nos preocupa la instancia exacta de GameObject
que se devuelve.
///<summary>We create a static string to allow us consistency.</summary>
string playerTag = "Player"
///<summary>We can now use the tag to reference our player GameObject.</summary>
GameObject player = GameObject.FindGameObjectWithTag(playerTag);
Encontrar una matriz de instancias de GameObject
Podemos usar la función estática GameObject.FindGameObjectsWithTag(string tag)
para buscar todos los objetos del juego que usan una etiqueta en particular. Esto es útil cuando queremos iterar a través de un grupo de objetos del juego en particular. Esto también puede ser útil si queremos encontrar un solo objeto de juego, pero podemos tener varios objetos de juego usando la misma etiqueta. Como no podemos garantizar la instancia exacta devuelto por GameObject.FindGameObjectWithTag(string tag)
, en lugar debemos recuperar una matriz de todas las posibles GameObject
instancias con GameObject.FindGameObjectsWithTag(string tag)
, y analizar más a fondo la matriz resultante para encontrar la instancia somos buscando.
///<summary>We create a static string to allow us consistency.</summary>
string enemyTag = "Enemy";
///<summary>We can now use the tag to create an array of all enemy GameObjects.</summary>
GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag );
// We can now freely iterate through our array of enemies
foreach(GameObject enemy in enemies)
{
// Do something to each enemy (link up a reference, check for damage, etc.)
}
Comparando etiquetas
Al comparar dos GameObjects por etiquetas, se debe tener en cuenta que lo siguiente causaría una sobrecarga de Garbage Collector como una cadena que se crea cada vez que:
if (go.Tag == "myTag")
{
//Stuff
}
Al realizar esas comparaciones dentro de Update () y la devolución de llamada de Unity (o un bucle) de Unity normal, debe usar este método sin asignación de almacenamiento dinámico:
if (go.CompareTag("myTag")
{
//Stuff
}
Además, es más fácil mantener tus etiquetas en una clase estática.
public static class Tags
{
public const string Player = "Player";
public const string MyCustomTag = "MyCustomTag";
}
Entonces puedes comparar con seguridad
if (go.CompareTag(Tags.MyCustomTag)
{
//Stuff
}
De esta manera, las cadenas de etiquetas se generan en el momento de la compilación, y usted limita las implicaciones de los errores de ortografía.
Al igual que mantener las etiquetas en una clase estática, también es posible almacenarlas en una enumeración:
public enum Tags
{
Player, Ennemies, MyCustomTag;
}
y luego puedes compararlo usando el método enum toString()
:
if (go.CompareTag(Tags.MyCustomTag.toString())
{
//Stuff
}