Layer và LayerMask
Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 38 trên 71.
Mỗi GameObject nằm trên một layer, được chọn trong menu Layer ở đầu Inspector. Unity có 32 layer: một số layer được tích hợp sẵn (0 Default, 2 Ignore Raycast, 4 Water, 5 UI), còn bạn có thể đặt tên layer riêng trong Tags and Layers, bắt đầu từ User Layer 3. LayerMask là một tập hợp các layer, mỗi layer ứng với một bit. Truyền một LayerMask vào raycast sau maxDistance, và tia sẽ bỏ qua mọi collider trên layer nằm ngoài tập hợp đó.
Người chơi này nên nhảy từ mặt đất, không phải từ đầu kẻ địch. Đặt sàn lên layer Ground, rồi thêm trường LayerMask vào script. Inspector sẽ hiển thị trường này dưới dạng menu, nơi bạn đánh dấu Ground:
[SerializeField] private LayerMask groundMask;
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}Mask chỉ gồm Ground cũng giúp phép kiểm tra không phát hiện người chơi. Tia bỏ qua collider mà nó bắt đầu bên trong, nhưng không bỏ qua các collider khác của người chơi, chẳng hạn như collider của đối tượng con. Các phép kiểm tra vùng chồng lấp trong bài học sau sẽ phát hiện collider của chính người chơi, nên nếu không có mask, phép kiểm tra ở chân sẽ luôn báo rằng người chơi đang đứng trên mặt đất. Đặt người chơi và các đối tượng con của họ lên layer Player, rồi loại Player khỏi các mask mà phép kiểm tra sử dụng. Trong code, LayerMask.GetMask("Ground", "Platform") tạo mask từ tên các layer, còn ~ đặt trước một mask sẽ đảo mask đó thành mọi layer mà nó không chứa.
Thử thách
Trung bìnhKhiến tia của trinh sát nhìn xuyên qua chiếc đèn lồng của chính nó.
- Trong
LookAhead(), tạoint mask = ~LayerMask.GetMask("Player");: mọi lớp ngoại trừ Player, nơi có Scout và Lantern. - Truyền
maskvào lệnh raycast, saurange.
Nhấn Chơi rồi xoay trinh sát bằng các phím mũi tên: Console hiển thị tên Rock và Tree. Sau đó nhấn Kiểm tra.
Tự làm thử
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;
}
}
// Tên của đối tượng đầu tiên ở phía trước trong phạm vi range, hoặc "nothing".
public string LookAhead()
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
{
return hit.collider.name;
}
return "nothing";
}
}
Tất cả bài học trong Vật lý và lối chơi
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity