Warstwy i LayerMask
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 36 z 63.
Każdy GameObject znajduje się na jednej warstwie, wybieranej w menu Layer u góry panelu Inspector. Unity ma 32 warstwy: kilka jest wbudowanych (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), a własne warstwy nazywasz w sekcji Tags and Layers, zaczynając od User Layer 3. LayerMask to zestaw warstw, z jednym bitem na warstwę. Przekaż taki zestaw do raycastu po maxDistance, a promień będzie ignorować każdy collider na warstwie spoza zestawu.
Ten gracz powinien skakać z ziemi, a nie z głów przeciwników. Podłogi umieść na warstwie Ground, a skrypt otrzyma pole LayerMask, które Inspector wyświetli jako menu, w którym zaznaczysz Ground:
[SerializeField] private LayerMask groundMask;
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}Maska obejmująca tylko Ground zapobiega też wykryciu gracza. Promień pomija collider, wewnątrz którego się zaczyna, ale nie pozostałe collidery gracza, takie jak collider obiektu potomnego, a testy nakładania z późniejszej lekcji wykrywają własny collider gracza. Dlatego test przy stopach, bez maski, zawsze zwracałby informację, że gracz stoi na ziemi. Umieść gracza i jego obiekty potomne na warstwie Player i pomijaj Player w maskach używanych przez testy. W kodzie LayerMask.GetMask("Ground", "Platform") tworzy maskę na podstawie nazw warstw, a ~ przed maską odwraca ją, obejmując każdą warstwę, której wcześniej nie zawierała.
Wyzwanie
ŚredniZwiadowca powinien zgłaszać, co znajduje się przed nim, ale LookAhead() zawsze zwraca Lantern. Promień omija ciało Zwiadowcy, wewnątrz którego się zaczyna, a następnie trafia w latarnię, którą Zwiadowca trzyma przed sobą. Zwiadowca i jego latarnia znajdują się na warstwie Player. Napraw LookAhead() w Spotter:
- Utwórz w kodzie maskę obejmującą każdą warstwę oprócz Player, używając
LayerMask.GetMask. - Przekaż ją do raycastu, który zachowuje swoje
range, aby promień mijał latarnię i zgłaszał pierwszą rzecz za nią.
Naciśnij Graj i obracaj zwiadowcę strzałkami: w konsoli wyświetla się to, co widzi. Następnie naciśnij Sprawdź.
Spróbuj swoich sił
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;
}
}
// Nazwa pierwszego obiektu z przodu, znajdującego się w zasięgu, lub "nothing".
public string LookAhead()
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
{
return hit.collider.name;
}
return "nothing";
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Fizyka i rozgrywka
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur