Menu
CoddyTech

Layer und LayerMask

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 36 von 63.

Jedes GameObject befindet sich auf genau einem Layer, der im Layer-Menü oben im Inspector ausgewählt wird. Unity hat 32: Einige sind integriert (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), und eigene legst du unter Tags and Layers an, beginnend bei User Layer 3. Eine LayerMask ist eine Menge von Layern, mit einem Bit pro Layer. Übergib sie einem Raycast nach maxDistance, und der Ray ignoriert jeden Collider auf einem Layer, der nicht in der Menge enthalten ist.

Dieser Spieler sollte vom Boden aus springen, nicht von den Köpfen der Gegner. Die Böden kommen auf einen Ground-Layer, und das Skript erhält ein LayerMask-Feld, das der Inspector als Menü anzeigt, 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 Prüfung den Spieler erfasst. Ein Ray überspringt den Collider, in dem er startet, aber nicht die anderen Collider des Spielers, etwa den eines Kindes. Die Überlappungsprüfungen in einer späteren Lektion erfassen den Collider des Spielers tatsächlich selbst. Daher würde eine Prüfung an den Füßen ohne Maske immer „am Boden“ melden. Lege den Spieler und seine Kinder auf einen Player-Layer und schließe Player aus den Masken aus, die bei den Prüfungen verwendet werden. Im Code erstellt LayerMask.GetMask("Ground", "Platform") eine Maske aus Layer-Namen, und ~ vor einer Maske kehrt sie um, sodass sie alle Layer enthält, die sie zuvor nicht enthielt.

challenge icon

Aufgabe

Mittel

Der Späher sollte melden, was sich vor ihm befindet, aber LookAhead() gibt immer Lantern zurück. Sein Strahl überspringt den Körper des Scouts, in dessen Innerem er beginnt, und trifft dann auf die Laterne, die der Scout vor sich hält. Der Scout und seine Laterne befinden sich auf dem Player-Layer. Korrigiere LookAhead() in Spotter:

  • Erstelle im Code eine Maske für alle Layer außer Player mit LayerMask.GetMask.
  • Übergib sie dem Raycast, der seine range beibehält, damit der Strahl die Laterne passiert und das erste Objekt dahinter meldet.

Drücke Play und drehe den Späher mit den Pfeiltasten: Die Console protokolliert, was er sieht. Drücke dann Check.

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 voraus 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";
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Physik und Gameplay