Sự kiện va chạm của Unity cung cấp cho bạn một đối tượng Va chạm cung cấp cho bạn một số thông tin về vụ va chạm đã xảy ra (bao gồm danh sách các Contactpoint với các quy tắc nhấn).
Nhưng những gì bạn không nhận được là quy tắc bề mặt cho máy va chạm mà bạn đạt được. Đây là một ảnh chụp màn hình để minh họa. Dòng màu đỏ là từ ContactPoint.normal
và dòng màu xanh là từ RaycastHit.normal
.
Đây có phải là một ví dụ về Unity ẩn thông tin để cung cấp API đơn giản hóa không? Hoặc các kỹ thuật phát hiện va chạm thời gian thực 3D tiêu chuẩn chỉ không thu thập thông tin này?
Và đối với phần thứ hai của câu hỏi, đâu là cách chắc chắn và tương đối hiệu quả để có được bề mặt bình thường khi va chạm?
Tôi biết rằng việc phát sóng mang lại cho bạn các quy tắc bề mặt, nhưng có vẻ như tôi cần phải thực hiện một số lần phát sóng để thực hiện điều này cho tất cả các kịch bản (có thể là một điểm tiếp xúc / kết hợp thông thường bỏ qua máy va chạm trên diễn viên đầu tiên, hoặc có thể bạn cần thực hiện trung bình tất cả quy tắc của các điểm tiếp xúc để có kết quả tốt nhất).
Phương pháp hiện tại của tôi:
Sao lưu
Collision.contacts[0].point
cùng với hit của nó bình thườngRaycast xuống hit phủ định bình thường cho
float.MaxValue
, trênCollision.collider
Nếu thất bại, lặp lại bước 1 và 2 với bình thường không phủ định
Nếu thất bại, hãy thử các bước từ 1 đến 3 với
Collision.contacts[1]
Lặp lại 4 cho đến khi thành công hoặc cho đến khi tất cả các điểm tiếp xúc cạn kiệt.
Từ bỏ, trở về
Vector3.zero
.
Điều này dường như bắt được tất cả mọi thứ, nhưng tất cả các chương trình phát sóng đó làm tôi thấy khó chịu và tôi không chắc làm thế nào để kiểm tra xem điều này có hiệu quả với đủ trường hợp không. Có cách nào tốt hơn?
EDIT Nếu đây thực sự chỉ là cách mọi thứ xảy ra với xung đột 3D, thì tổng quan về lý do tại sao trong trường hợp chung sẽ được chào đón như một điều gì đó cụ thể đối với Unity.