Menu
CoddyTech

Katmanlar ve LayerMask

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

Her GameObject, Inspector'ın üst kısmındaki Layer menüsünden seçilen tek bir katmanda bulunur. Unity'de 32 katman vardır: birkaç tanesi 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, katmanlardan oluşan bir kümedir; her katman için bir bit kullanılır. maxDistance değerinden sonra bir raycast'e bu kümeyi iletin; ışın, kümenin dışındaki bir katmanda bulunan tüm çarpıştırıcıları yok sayar.

Bu oyuncu, düşmanların başlarından değil, yerden zıplamalı. Zeminler Ground katmanına alınır 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, denetimin oyuncuyu bulmasını da engeller. Bir ışın, başladığı çarpıştırıcının içindeyse o çarpıştırıcıyı atlar; ancak oyuncunun çocuk nesnesine ait çarpıştırıcılar gibi diğer çarpıştırıcılarını atlamaz. Ayrıca sonraki bir dersteki örtüşme testleri oyuncunun kendi çarpıştırıcısını bulur; bu nedenle maskesiz bir ayak denetimi her zaman yerde olunduğunu söyler. Oyuncuyu ve çocuk nesnelerini Player katmanına alın ve Player'ı denetimlerin kullandığı maskelerin dışında tutun. Kodda LayerMask.GetMask("Ground", "Platform"), katman adlarından bir maske oluşturur; bir maskenin önündeki ~ ise maskeyi, içinde bulunmayan tüm katmanları kapsayacak şekilde tersine çevirir.

challenge icon

Görev

Orta

Gözcü önünde ne olduğunu bildirmeli, ancak LookAhead() her zaman Lantern döndürüyor. Işını, içinde başladığı Gözcü'nün gövdesini atlıyor, ardından Gözcü'nün önünde tuttuğu fenere çarpıyor. Gözcü ve feneri Player katmanında. Spotter içindeki LookAhead() işlevini düzelt:

  • LayerMask.GetMask ile kodda Player dışındaki tüm katmanların maskesini oluştur.
  • Maskeyi ışın taramasına geçir; range değerini koruyarak ışının fenerin içinden geçmesini ve ötesindeki ilk şeyi bildirmesini sağla.

Play düğmesine bas ve ok tuşlarıyla gözcüyü döndür: Konsol gördüklerini kaydeder. Ardından Check 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 mesafesi içindeki 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";
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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