Menu
CoddyTech

Layer dan LayerMask

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 36 dari 63.

Setiap GameObject berada di satu layer, yang dipilih melalui menu Layer di bagian atas Inspector. Unity memiliki 32 layer: beberapa sudah tersedia (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), dan kamu dapat memberi nama sendiri melalui Tags and Layers, dimulai dari User Layer 3. LayerMask adalah kumpulan layer, dengan satu bit untuk setiap layer. Berikan satu LayerMask ke raycast setelah maxDistance, maka ray akan mengabaikan setiap collider pada layer yang tidak termasuk dalam kumpulan tersebut.

Pemain ini seharusnya melompat dari tanah, bukan dari kepala musuh. Letakkan lantai pada layer Ground, lalu tambahkan field LayerMask ke skrip. Inspector akan menampilkannya sebagai menu tempat kamu mencentang Ground:

[SerializeField] private LayerMask groundMask;

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

Mask yang hanya berisi Ground juga mencegah pemeriksaan mendeteksi pemain. Ray melewati collider tempat ray dimulai, tetapi tidak melewati collider pemain lainnya, seperti collider milik objek anak. Selain itu, pengujian overlap pada pelajaran berikutnya memang mendeteksi collider milik pemain, sehingga pemeriksaan di kaki tanpa mask akan selalu menyatakan bahwa pemain berada di tanah. Letakkan pemain dan objek anaknya pada layer Player, lalu jangan sertakan Player dalam mask yang digunakan pemeriksaannya. Dalam kode, LayerMask.GetMask("Ground", "Platform") membuat mask dari nama layer, sedangkan ~ di depan mask membalikkannya sehingga mencakup semua layer yang sebelumnya tidak ada di dalamnya.

challenge icon

Tantangan

Sedang

Scout seharusnya melaporkan apa yang ada di depannya, tetapi LookAhead() selalu mengembalikan Lantern. Raycast-nya melewati tubuh Scout, yang menjadi titik awalnya, lalu mengenai lentera yang dipegang Scout di depannya. Scout dan Lantern berada di layer Player. Perbaiki LookAhead() di Spotter:

  • Buat mask untuk semua layer kecuali Player di dalam kode, dengan LayerMask.GetMask.
  • Teruskan mask tersebut ke raycast, yang tetap menggunakan range, agar raycast melewati lentera dan melaporkan benda pertama setelahnya.

Tekan Jalankan dan putar Scout dengan tombol panah: Console mencatat apa yang dilihatnya. Lalu tekan Periksa.

Coba sendiri

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

    // Nama benda pertama di depan dalam jangkauan, atau "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay