Menu
CoddyTech

Layer und LayerMask

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 38 von 71.

Jedes GameObject befindet sich auf einer Ebene, die im Menü „Layer“ oben im Inspector ausgewählt wird. Unity hat 32: Einige sind integriert (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), und eigene Ebenen benennst du unter Tags and Layers, beginnend mit User Layer 3. Eine LayerMask ist eine Menge von Ebenen, mit einem Bit pro Ebene. Übergib sie nach maxDistance an einen Raycast, und der Strahl ignoriert jeden Collider auf einer Ebene außerhalb der Menge.

Dieser Spieler sollte vom Boden springen, nicht von den Köpfen der Gegner. Die Böden kommen auf eine Ground-Ebene, und das Skript erhält ein LayerMask-Feld, das im Inspector als Menü angezeigt wird, in dem du Ground auswählst:

[SerializeField] private LayerMask groundMask;

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}

Eine Maske, die nur Ground enthält, verhindert außerdem, dass die Abfrage den Spieler findet. Ein Strahl überspringt den Collider, in dem er startet, aber nicht die anderen Collider des Spielers, etwa den eines Kindes. Die Überlappungstests in einer späteren Lektion finden den eigenen Collider des Spielers tatsächlich, daher würde eine Abfrage an den Füßen ohne Maske immer „am Boden“ melden. Lege den Spieler und seine Kinder auf eine Player-Ebene und nimm Player aus den Masken heraus, die seine Abfragen verwenden. Im Code erstellt LayerMask.GetMask("Ground", "Platform") eine Maske anhand von Ebenennamen, und ~ vor einer Maske kehrt sie in alle Ebenen um, die sie nicht enthielt.

challenge icon

Aufgabe

Mittel

Lass den Strahl des Spähers über seine eigene Laterne hinausschauen.

  1. Erstelle in LookAhead() int mask = ~LayerMask.GetMask("Player");: jede Ebene außer Player, auf der sich der Späher und seine Laterne befinden.
  2. Übergib mask nach range an den Raycast.

Drücke auf „Spielen“ und drehe den Späher mit den Pfeiltasten: In der Console werden Rock und Tree angezeigt. Drücke anschließend auf „Prüfen“.

Probier es selbst

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;
        }
    }

    // Der Name des ersten Objekts in Blickrichtung innerhalb der Reichweite oder "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}

Alle Lektionen in Physik und Gameplay

Übe selbstständig: Unity-Playground