Menu
CoddyTech

Katmanlar ve LayerMask

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 38 / 71.

Her GameObject, Inspector'ın üst kısmındaki Layer menüsünden seçilen tek bir katmanda bulunur. Unity'de 32 katman vardır: bazıları yerleşik olarak gelir (0 Default, 2 Ignore Raycast, 4 Water, 5 UI); kendi katmanlarınızı Tags and Layers bölümünde, User Layer 3'ten başlayarak adlandırabilirsiniz. Bir LayerMask, her katman için bir bit içeren katmanlar kümesidir. maxDistance değerinden sonra bir raycast'e bunu verin; ışın, kümenin dışında kalan bir katmandaki her collider'ı yok sayar.

Bu oyuncu, düşmanların başlarından değil, yerden zıplamalı. Zeminler Ground katmanına yerleştirilir ve betiğe bir LayerMask alanı eklenir; Inspector bunu Ground'u işaretleyebileceğiniz bir menü olarak gösterir:

[SerializeField] private LayerMask groundMask;

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

Yalnızca Ground'u içeren bir maske, kontrolün oyuncuyu bulmasını da engeller. Bir ışın, içinde başladığı collider'ı atlar; ancak oyuncunun çocuk nesnesi gibi diğer collider'larını atlamaz ve sonraki bir dersteki örtüşme testleri oyuncunun kendi collider'ını bulur. Bu nedenle, ayaklarda maske olmadan yapılan bir kontrol her zaman yerde olunduğunu söyler. Oyuncuyu ve çocuk nesnelerini Player katmanına yerleştirin ve Player'ı kontrollerinizin kullandığı maskelerin dışında tutun. Kodda LayerMask.GetMask("Ground", "Platform"), katman adlarından bir maske oluşturur; bir maskenin önündeki ~ ise onu, içermediği tüm katmanları kapsayacak şekilde tersine çevirir.

challenge icon

Görev

Orta

Gözcünün ışınının kendi fenerinin ötesini görmesini sağla.

  1. LookAhead() içinde int mask = ~LayerMask.GetMask("Player"); oluştur: Gözcü ve Fener'in bulunduğu Player dışındaki tüm katmanlar.
  2. Işın denetimine range'den sonra mask değerini geçir.

“Oyna” düğmesine bas ve oklarla gözcüyü döndür: Console, Rock ve Tree adlarını gösterir. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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

    // Önde, range içinde bulunan ilk şeyin adı veya "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}

Fizik ve Oynanış bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground