23/12/2014
En el vasto universo del desarrollo de videojuegos con Unity, existen herramientas fundamentales que, aunque sencillas en apariencia, son la columna vertebral de sistemas complejos y eficientes. Una de estas herramientas son las Etiquetas o Tags. Si alguna vez te has preguntado cómo hacer que tu juego distinga entre el jugador, un enemigo, una moneda o una pared, la respuesta casi siempre involucra el uso de tags. Son una forma simple pero increíblemente poderosa de identificar y categorizar cualquier GameObject en tu escena, permitiendo que tus scripts interactúen con ellos de manera inteligente y ordenada. Entender su funcionamiento no es solo una buena práctica, es un paso esencial para pasar de ser un desarrollador principiante a uno capaz de construir lógicas de juego robustas y escalables.

- ¿Qué es Exactamente una Etiqueta (Tag) en Unity?
- El Centro de Control: El Administrador de Tags y Layers
- Aplicando Etiquetas: Dos Caminos, un Mismo Destino
- Estrategias y Usos Prácticos de las Etiquetas
- Tabla Comparativa: Identificando GameObjects
- La Trampa Mortal: El Peligro de Renombrar Etiquetas
- Preguntas Frecuentes (FAQ)
¿Qué es Exactamente una Etiqueta (Tag) en Unity?
Imagina que estás organizando una enorme biblioteca. No pondrías todos los libros al azar en las estanterías, ¿verdad? Los clasificarías por género: ficción, no ficción, ciencia ficción, etc. En Unity, las etiquetas funcionan de manera muy similar. Un tag es, en esencia, una etiqueta de texto que le asignas a un GameObject para identificarlo. Sirve como un marcador que dice "Este objeto es el Jugador" o "Este objeto es un Enemigo".
La principal utilidad de los tags reside en la capacidad de buscar y filtrar GameObjects desde el código. En lugar de buscar un objeto por su nombre específico (lo cual puede ser problemático si tienes muchos objetos llamados "Enemigo_1", "Enemigo_2", etc.), puedes simplemente pedirle a Unity que encuentre todos los objetos con la etiqueta "Enemigo".
Es crucial entender dos limitaciones fundamentales de las etiquetas:
- Una etiqueta por GameObject: Cada GameObject solo puede tener una única etiqueta asignada a la vez. Si necesitas una categorización más compleja, a menudo se recurre a otras técnicas como el uso de componentes o GameObjects hijos con sus propias etiquetas.
- Declaración previa: No puedes simplemente asignar una etiqueta a un objeto escribiendo un texto cualquiera. Primero debes declararla en el administrador de "Tags and Layers" de Unity. Esto asegura que todas las etiquetas estén centralizadas y se eviten errores tipográficos.
Por defecto, todos los GameObjects que creas en una escena nueva vienen con la etiqueta "Untagged" (Sin etiqueta), indicando que no se les ha asignado ninguna categoría específica.
Antes de poder usar una etiqueta personalizada, debes registrarla en Unity. Este proceso se realiza a través de la ventana "Tags and Layers", el centro neurálgico para la gestión de estas identificaciones. Para acceder a ella, sigue esta ruta en el menú superior de Unity: Edit > Project Settings > Tags and Layers.
Una vez dentro, verás una sección desplegable llamada "Tags". Aquí encontrarás una lista. Las primeras etiquetas suelen estar predefinidas por Unity (como "Player", "MainCamera", etc.), pero debajo tienes una lista expandible para añadir las tuyas. El proceso es muy sencillo:
- Haz clic en el botón con el símbolo de más (+) para añadir un nuevo campo de etiqueta.
- Escribe el nombre que deseas para tu nueva etiqueta (por ejemplo, "Enemigo", "Moneda", "PuertaSecreta").
- Presiona Enter o haz clic fuera del campo. La etiqueta se guardará automáticamente.
Para eliminar una etiqueta, simplemente selecciónala y haz clic en el botón con el símbolo de menos (-). Ten en cuenta que la etiqueta se marcará como "(Removed)" y se eliminará por completo la próxima vez que se recargue el proyecto. Es importante ser organizado y definir las etiquetas que necesitarás en tu proyecto desde una etapa temprana para mantener la consistencia.
Aplicando Etiquetas: Dos Caminos, un Mismo Destino
Una vez que has declarado tus etiquetas en el administrador, es hora de asignarlas a tus GameObjects. Unity te ofrece dos formas principales de hacerlo: a través del editor visual o mediante código.
A través del Inspector (El Método Visual)
Este es el método más común y directo, ideal para objetos que colocas manualmente en la escena.

- Selecciona el GameObject (o varios a la vez) que deseas etiquetar en la ventana de Jerarquía o en la vista de Escena.
- En la ventana del Inspector, en la parte superior, verás un menú desplegable junto a la palabra "Tag".
- Haz clic en este menú y selecciona la etiqueta que deseas aplicar de la lista. Esta lista contendrá todas las etiquetas predefinidas y las que tú hayas creado.
¡Y eso es todo! El GameObject ahora está identificado con esa etiqueta. Es un proceso rápido e intuitivo para configurar tu escena.
Mediante Código (El Poder del Scripting)
En muchas situaciones, necesitarás cambiar la etiqueta de un objeto dinámicamente durante el juego. Por ejemplo, un personaje que es un "Aliado" podría convertirse en un "Enemigo" tras un evento en la historia. Aquí es donde entra en juego la asignación por script.
Puedes cambiar la etiqueta de un GameObject accediendo a su propiedad .tag. Es importante recordar que la cadena de texto que asignes debe coincidir exactamente con una etiqueta ya declarada en el administrador de "Tags and Layers", de lo contrario, Unity lanzará un error.
Una excelente práctica es declarar tus etiquetas como variables estáticas para evitar errores de escritura y facilitar el mantenimiento. Observa el siguiente ejemplo:
using UnityEngine; public class GestorDeEtiquetas: MonoBehaviour { // Almacenamos los nombres de las etiquetas en variables estáticas para evitar errores. static string tagJugador = "Player"; static string tagEnemigo = "Enemy"; static string tagSinEtiqueta = "Untagged"; public GameObject jugador; public GameObject[] enemigos; void Start() { // Nos aseguramos de que el objeto con este script no tenga una etiqueta específica. gameObject.tag = tagSinEtiqueta; // Asignamos la etiqueta "Player" a nuestro objeto jugador. if (jugador != null) { jugador.tag = tagJugador; } // Recorremos el array de enemigos y les asignamos su etiqueta correspondiente. foreach (GameObject enemigo in enemigos) { if (enemigo != null) { enemigo.tag = tagEnemigo; } } } }Este enfoque hace que tu código sea mucho más limpio, seguro y fácil de modificar en el futuro.
Estrategias y Usos Prácticos de las Etiquetas
Saber cómo crear y asignar etiquetas es solo el principio. Su verdadero poder se revela cuando las usas en tus scripts para crear mecánicas de juego.
- Detección de Colisiones: El uso más clásico. Cuando un objeto colisiona con otro, puedes comprobar la etiqueta del objeto con el que ha chocado para decidir qué hacer. Por ejemplo, en un método
OnTriggerEnter(Collider other), puedes usarif (other.CompareTag("Moneda"))para detectar si el jugador ha recogido una moneda. Se recomienda usar el métodoCompareTag()en lugar deother.tag == "Moneda"porque está más optimizado y no genera basura en la memoria. - Búsqueda de GameObjects: A veces necesitas encontrar un objeto específico en la escena. Unity te ofrece métodos muy útiles para ello:
GameObject.FindWithTag("Player"): Devuelve el primer GameObject activo que encuentra con la etiqueta especificada. Es rápido y eficiente si sabes que solo hay un objeto de ese tipo (como el jugador).GameObject.FindGameObjectsWithTag("Enemy"): Devuelve un array con todos los GameObjects activos que tienen esa etiqueta. Es perfecto para obtener una lista de todos los enemigos y hacer que, por ejemplo, todos te persigan.
Tabla Comparativa: Identificando GameObjects
Existen varias formas de identificar un GameObject en Unity. Aquí tienes una tabla que compara las más comunes para que sepas cuándo usar cada una.
| Método | Ventajas | Desventajas | Cuándo Usarlo |
|---|---|---|---|
| Tags (Etiquetas) | Muy rápido (especialmente con CompareTag), fácil de usar para grupos. | Solo una etiqueta por objeto. Renombrar una etiqueta en el editor no actualiza el código. | Para identificar tipos o grupos de objetos (jugador, enemigos, coleccionables, etc.) en colisiones y búsquedas. |
| Nombres (gameObject.name) | Simple y directo para objetos únicos. | Muy frágil. Si alguien cambia el nombre del objeto en el editor, el código se rompe. Lento para buscar. | Rara vez recomendado. Quizás para depuración o para objetos muy específicos que nunca cambiarán de nombre. |
| Layers (Capas) | Muy eficiente para la física y el renderizado. Permite ignorar colisiones entre capas. | Limitado a 32 capas. Su propósito principal no es la identificación en scripts, sino la física. | Para controlar qué objetos interactúan físicamente entre sí (ej. balas que no colisionan con el jugador que las dispara). |
| Componentes (GetComponent) | Muy robusto y orientado a la funcionalidad. Identifica objetos por lo que *hacen*, no por lo que *son*. | Ligeramente más lento que los tags si se usa en exceso (ej. en Update). | Cuando necesitas interactuar con un script específico en otro objeto (ej. llamar al método `RecibirDaño()` de un script `SaludEnemigo`). |
La Trampa Mortal: El Peligro de Renombrar Etiquetas
Aquí llegamos a un punto crítico que ha causado dolores de cabeza a muchos desarrolladores. Cuando renombras una etiqueta en la ventana de "Tags and Layers", Unity no actualiza automáticamente las cadenas de texto en tus scripts. Si tenías un código que buscaba la etiqueta "OrcoFeo" y la renombras a "OrcoVerde" en el editor, tu código que hace `CompareTag("OrcoFeo")` dejará de funcionar instantáneamente, y puede ser muy difícil de depurar.
Este comportamiento hace que la gestión de etiquetas sea algo delicada. La mejor defensa es una buena planificación:
- Define tus etiquetas al principio: Intenta pensar en todas las etiquetas que necesitarás y créalas antes de empezar a escribir mucho código.
- No las renombres a la ligera: Una vez que una etiqueta está en uso en tus scripts, evita renombrarla a toda costa. Si es absolutamente necesario, prepárate para hacer una búsqueda y reemplazo manual en todo tu proyecto, con mucho cuidado.
- Usa variables estáticas: Como se mostró en el ejemplo de código, centralizar los nombres de las etiquetas en un solo script puede mitigar el problema. Si necesitas cambiar una etiqueta, solo tendrías que cambiar la cadena en esa variable (además de en el editor), pero al menos no tendrías que buscarla por todo el código.
Preguntas Frecuentes (FAQ)
- ¿Puede un GameObject tener más de una etiqueta?
- No, un GameObject solo puede tener una etiqueta. Una solución común a este problema es crear un GameObject hijo vacío y asignarle una segunda etiqueta. De esta forma, el objeto padre puede tener la etiqueta "Enemigo" y un hijo la etiqueta "LiderDePeloton", por ejemplo.
- ¿Cuál es la diferencia entre una Tag y una Layer?
- Las Tags son para la identificación de GameObjects a nivel de scripting. Las Layers (Capas) se utilizan principalmente para el sistema de física y de renderizado de la cámara. Con las capas, puedes hacer que ciertos objetos no colisionen entre sí o que una cámara solo renderice los objetos de una capa específica.
- ¿Es `CompareTag()` realmente más rápido que `tag == "MiTag"`?
- Sí. El método `CompareTag()` está optimizado internamente por Unity. La comparación directa con `==` implica una creación de cadenas y puede generar "basura" en la memoria, lo que puede causar pequeñas pausas en el rendimiento si se hace muy a menudo (como en un método `Update`). `CompareTag()` evita esto.
- ¿Qué pasa si uso una etiqueta en un script que no existe en el Manager?
- Unity te lanzará un error en la consola indicando que la etiqueta que intentas asignar o comparar no ha sido definida. Esta es la razón por la que es obligatorio declarar todas las etiquetas antes de usarlas.
Si quieres conocer otros artículos parecidos a Dominando las Tags en Unity: Guía Esencial puedes visitar la categoría Juegos.
