Vỡ khi va chạm
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 10 trên 71.
Cú va chạm mạnh đến mức nào? collision.relativeVelocity cho biết hai đối tượng tiến lại gần nhau nhanh đến mức nào vào lúc chúng va vào nhau, còn magnitude là tốc độ va chạm tính bằng m/s. Đây là hiệu giữa hai vận tốc: một chiếc xe chạy với tốc độ 10 m/s đâm vào một chiếc xe chạy cùng chiều với tốc độ 8 m/s thì chỉ va chạm với tốc độ 2 m/s, và cả hai xe đều ghi nhận cùng một tốc độ va chạm.
Quả trứng này vỡ khi tiếp đất với tốc độ lớn hơn crackSpeed. Thả từ độ cao 1 m, trứng va chạm với tốc độ khoảng 4.4 m/s (căn bậc hai của 2 x 9.81 x 1), còn thả từ độ cao 2 m thì khoảng 6.3 m/s:
public float crackSpeed = 5f;
void OnCollisionEnter(Collision collision)
{
if (collision.relativeVelocity.magnitude > crackSpeed)
{
Debug.Log("Splat!");
Destroy(gameObject);
}
}Tại sao không dùng rb.linearVelocity của quả trứng? Khi OnCollisionEnter chạy, hệ thống vật lý đã xử lý cú va chạm, nên vận tốc còn lại của quả trứng sau đó gần bằng không. relativeVelocity giữ lại tốc độ của chính cú va chạm. Đây là tốc độ, nên khối lượng không ảnh hưởng: một quả trứng nặng và một quả nhẹ tiếp đất với tốc độ 6 m/s đều ghi nhận cùng mức 6.
Thử thách
DễViết Window.cs: mỗi lần va chạm sẽ làm cửa sổ yếu đi, và cửa sổ vỡ khi độ bền còn 0.
- Trong
OnCollisionEntercủa cửa sổ, trừcollision.relativeVelocity.magnitudekhỏistrength. - Khi
strength <= 0f, gọiDestroy(gameObject);.
Nhấn Chơi, lăn những quả bóng nhẹ bằng phím mũi tên lên, rồi lăn một quả bóng mạnh bằng phím Space: cửa sổ sẽ vỡ. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Window : MonoBehaviour
{
public float strength = 10f;
// Mỗi cú va chạm làm giảm strength theo tốc độ va chạm; khi strength về 0, cửa kính vỡ tan
}
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