Menu
CoddyTech

Warstwy i LayerMask

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 38 z 71.

Każdy GameObject znajduje się na jednej warstwie wybranej w menu Layer u góry Inspektora. Unity ma 32 warstwy: kilka jest wbudowanych (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), a własne nazywasz w sekcji Tags and Layers, zaczynając od User Layer 3. LayerMask to zestaw warstw, po jednym bicie na każdą warstwę. Przekaż go do raycastu po maxDistance, a promień zignoruje każdy collider na warstwie spoza zestawu.

Ta postać powinna skakać z ziemi, a nie z głów przeciwników. Podłogi umieść na warstwie Ground, a skrypt otrzyma pole LayerMask, które Inspektor wyświetla jako menu, w którym zaznaczasz 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 postaci przez to sprawdzenie. Promień pomija collider, wewnątrz którego się rozpoczyna, ale nie pozostałe collidery postaci, na przykład należące do obiektu potomnego, a testy nakładania się z późniejszej lekcji wykrywają własny collider postaci, więc sprawdzenie przy stopach bez maski zawsze zwróciłoby, że postać stoi na ziemi. Umieść postać i jej obiekty potomne na warstwie Player i wyklucz Player z masek używanych przez jej sprawdzenia. W kodzie LayerMask.GetMask("Ground", "Platform") tworzy maskę na podstawie nazw warstw, a ~ przed maską odwraca ją, obejmując wszystkie warstwy, których wcześniej nie zawierała.

challenge icon

Wyzwanie

Średni

Spraw, by promień zwiadowcy omijał jego własną latarnię.

  1. W LookAhead() utwórz int mask = ~LayerMask.GetMask("Player");: wszystkie warstwy oprócz Player, na których znajdują się zwiadowca i jego latarnia.
  2. Przekaż mask do raycastu, po range.

Naciśnij „Graj” i obracaj zwiadowcę strzałkami: w konsoli pojawią się nazwy Skały i Drzewa. 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 przed nami w zasięgu range lub "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity