Dos cosas distintas que se confunden#
- Tag (etiqueta): una palabra que identifica qué es un objeto ("Player", "Enemy", "Coin"). Sirve para reconocerlo desde código.
- Layer (capa): un grupo al que pertenece un objeto, usado por el motor para filtrar física, raycasts y renderizado.
Regla mental: Tag = "quién eres", Layer = "cómo te trata el motor".
Tags#
Se crean en el Inspector (arriba, desplegable Tag → Add Tag) y se asignan a cada objeto. Desde código, compáralas con CompareTag:
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Coin"))
Recoger(other.gameObject);
}Usa other.CompareTag("Coin") en vez de other.tag == "Coin". CompareTag es más rápido y no genera basura para el recolector; además, comparar con una tag inexistente con == puede dar sorpresas. CompareTag con una tag no registrada avisa con un error claro.
Layers#
Se crean en Tag → Add Layer (hay 32 en total, algunas reservadas por Unity). Sus dos usos principales:
1. Filtrar colisiones (Collision Matrix)#
En Project Settings → Physics hay una cuadrícula donde decides qué capas chocan con cuáles. Por ejemplo: que las "BalasJugador" no colisionen con el "Jugador", o que dos "Enemigos" se atraviesen. Es la forma correcta y eficiente de filtrar colisiones, mejor que comprobarlo en código.
2. LayerMask en raycasts y consultas#
Un LayerMask limita a qué capas afecta un raycast o una detección, ignorando el resto:
[SerializeField] private LayerMask capaSuelo;
bool EnSuelo()
{
// Solo detecta objetos de la(s) capa(s) marcada(s) en el Inspector
return Physics.Raycast(transform.position, Vector3.down, 1.1f, capaSuelo);
}Ver Raycasting y Colliders y triggers.
Comparativa#
| Tag | Layer | |
|---|---|---|
| Para qué | Identificar qué es un objeto | Filtrar física/render por grupos |
| Cuántas | Muchas | 32 (varias reservadas) |
| Se usa en código con | CompareTag(...) | LayerMask, comprobaciones de bits |
| Un objeto puede tener | Una tag | Una layer |
Comprobar la layer de un objeto por código#
Las layers funcionan con bits, lo que despista. Para comprobar si un objeto está en un LayerMask:
bool EstaEnMascara(GameObject obj, LayerMask mascara)
{
// desplaza 1 a la posición de la layer del objeto y comprueba el bit
return (mascara.value & (1 << obj.layer)) != 0;
}Errores frecuentes#
- Usar Tags para lo que deberían ser Layers (filtrar colisiones a mano en código en vez de con la matriz).
- Comparar tags con
==en lugar deCompareTag. - Olvidar asignar la layer a todos los objetos que deben filtrarse (una plataforma sin la layer "Suelo" no se detecta).
- Confundir el índice de la layer con su valor en la máscara (uno usa bits, el otro no).
Resumen#
Las Tags identifican objetos ("es un enemigo"); compáralas con CompareTag. Las Layers agrupan objetos para que el motor filtre colisiones (Collision Matrix) y raycasts (LayerMask). No son intercambiables: usa tags para reconocer y layers para filtrar.