Capas y LayerMask
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 38 de 71.
Cada GameObject está en una capa, elegida en el menú Layer de la parte superior del Inspector. Unity tiene 32: algunas vienen integradas (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), y puedes nombrar las tuyas en Tags and Layers, empezando por User Layer 3. Una LayerMask es un conjunto de capas, con un bit por capa. Pasa una a un raycast después de maxDistance, y el rayo ignora todos los colisionadores de las capas que no están en el conjunto.
Este jugador debería saltar desde el suelo, no desde la cabeza de los enemigos. Los suelos van en una capa Ground, y el script obtiene un campo LayerMask, que el Inspector muestra como un menú donde marcas Ground:
[SerializeField] private LayerMask groundMask;
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}Una máscara que solo incluye Ground también evita que la comprobación detecte al jugador. Un rayo omite el colisionador en cuyo interior empieza, pero no los otros colisionadores del jugador, como el de un objeto hijo, y las pruebas de solapamiento de una lección posterior sí detectan el propio colisionador del jugador, así que una comprobación en los pies sin máscara siempre diría que está en el suelo. Pon al jugador y a sus objetos hijos en una capa Player y deja Player fuera de las máscaras que usan sus comprobaciones. En código, LayerMask.GetMask("Ground", "Platform") crea una máscara a partir de nombres de capas, y ~ delante de una máscara la invierte para incluir todas las capas que no contenía.
Desafío
IntermedioHaz que el rayo del explorador mire más allá de su propia linterna.
- En
LookAhead(), creaint mask = ~LayerMask.GetMask("Player");: todas las capas excepto Player, donde están el explorador y su linterna. - Pasa
maskal raycast, después derange.
Pulsa «Jugar» y gira el explorador con las flechas: la consola indica los nombres de la roca y del árbol. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Spotter : MonoBehaviour
{
public float range = 10f;
private string last = "";
void Update()
{
string seen = LookAhead();
if (seen != last)
{
Debug.Log("Ahead: " + seen);
last = seen;
}
}
// El nombre del primer objeto que haya delante dentro del alcance, o "nothing".
public string LookAhead()
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
{
return hit.collider.name;
}
return "nothing";
}
}
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento4Corrutinas
InvocarInvokeRepeating y CancelInvokeTu primera corrutinaBucles en corrutinasDetener corrutinasRepaso: cuenta regresiva10Proyecto: Escape de la arena
La arenaCazadores2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de Monedas
La pelota rodanteMonedas para recoger3Disparadores
Colisionadores de tipo triggerOnTriggerEnterObjetos coleccionablesLas cajas guardan el restoZonas letalesEntrada y salidaRepaso: llave y puertaPractica por tu cuenta: Playground de Unity