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.
Tantangan
SedangScout 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";
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Fisika dan Gameplay
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa Hancur