Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Zwiadowca 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";
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka