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.
Aufgabe
MittelLass den Strahl des Spähers über seine eigene Laterne hinausschauen.
- Erstelle in
LookAhead()int mask = ~LayerMask.GetMask("Player");: jede Ebene außer Player, auf der sich der Späher und seine Laterne befinden. - Übergib
masknachrangean 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
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground