Physics.Raycast
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 35 trên 71.
Tia raycast bắn một đường thẳng vô hình từ một điểm theo một hướng rồi cho biết đường đó có va chạm với collider hay không. Physics.Raycast(origin, direction, maxDistance) trả về true khi có collider nằm trên đường thẳng trong phạm vi maxDistance đơn vị, nếu không thì trả về false. Chiếc xe này phanh khi có vật thể nào cách đầu xe chưa đến 2 đơn vị:
public float brakeDistance = 2f;
void Update()
{
if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
{
Debug.Log("Brake!");
}
}transform.forward xoay theo xe, nên tia luôn hướng ra phía đầu xe; Vector3.forward thì luôn hướng dọc theo trục z của thế giới. Tia bắt đầu từ tâm xe, bên trong collider của chính nó, mà tia không bao giờ báo cáo collider chứa điểm bắt đầu, nên xe không phát hiện chính nó. Nếu bỏ maxDistance, tia sẽ kéo dài vô tận: xe sẽ phanh khi gặp một bức tường ở phía bên kia bản đồ.
Tia phát hiện collider chứ không phát hiện những gì được vẽ: một đối tượng có Renderer nhưng không có collider sẽ vô hình với tia, còn collider dạng trigger vẫn được tính là va chạm. Trong lúc kiểm tra, Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) sẽ vẽ tia trong chế độ xem Scene của Unity.
Thử thách
Trung bìnhMở cửa hàng khi có người đứng bên dưới cảm biến.
- Trong
Update(), kiểm traPhysics.Raycast(transform.position, Vector3.down, reach): một tia hướng thẳng xuống, dàireachđơn vị và dừng phía trên mặt đất. - Nếu điều kiện đúng, gọi
door.SetActive(false);, còn trongelse, gọidoor.SetActive(true);.
Nhấn Chơi rồi cho Visitor đi bên dưới cảm biến: cửa mở ra rồi đóng lại phía sau Visitor. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class DoorSensor : MonoBehaviour
{
public GameObject door;
public float reach = 3f;
void Update()
{
// Mở cửa khi tia chiếu xuống từ Sensor chạm vào vật thể.
}
}
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