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.
Wyzwanie
ŚredniSpraw, by promień zwiadowcy omijał jego własną latarnię.
- W
LookAhead()utwórzint mask = ~LayerMask.GetMask("Player");: wszystkie warstwy oprócz Player, na których znajdują się zwiadowca i jego latarnia. - Przekaż
maskdo raycastu, porange.
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
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa4Korutyny
WywoływanieInvokeRepeating i CancelInvokeTwoja pierwsza korutynaPętle w korutynachZatrzymywanie korutynPodsumowanie: odliczanie10Projekt: Ucieczka z areny
ArenaŁowcy2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur5Projekt: Wyścig po monety
Tocząca się piłkaZbieranie monet3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterPrzedmioty do zebraniaSkrzynie zatrzymują resztęStrefy śmierciWejście i wyjściePodsumowanie: klucz i drzwiPoćwicz samodzielnie: Edytor online Unity