Unity's on collision event memberi Anda objek Collision yang memberi Anda beberapa informasi tentang collision yang terjadi (termasuk daftar ContactPoints dengan hit normals).
Tapi yang tidak Anda dapatkan adalah permukaan normal untuk collider yang Anda pukul. Berikut screenshot untuk diilustrasikan. Garis merah berasal dari ContactPoint.normal
dan garis biru dari RaycastHit.normal
.
Apakah ini merupakan contoh dari persembunyian informasi untuk menyediakan API yang disederhanakan? Atau apakah teknik deteksi tabrakan realtime 3D standar tidak mengumpulkan informasi ini?
Dan untuk bagian kedua dari pertanyaan, apa cara yang pasti dan relatif efisien untuk mendapatkan permukaan yang normal untuk tabrakan?
Saya tahu bahwa raycasting memberi Anda normals permukaan, tetapi sepertinya saya perlu melakukan beberapa raycast untuk mencapai ini untuk semua skenario (mungkin kombinasi titik kontak / normal melewatkan collider pada pemeran pertama, atau mungkin Anda perlu melakukan rata-rata semua normal poin kontak 'untuk mendapatkan hasil terbaik).
Metode saya saat ini:
Cadangkan
Collision.contacts[0].point
sepanjang hitnya normalRaycast ke hit normal dinegasikan untuk
float.MaxValue
, padaCollision.collider
Jika itu gagal, ulangi langkah 1 dan 2 dengan yang tidak dinegasikan normal
Jika gagal, coba langkah 1 hingga 3 dengan
Collision.contacts[1]
Ulangi 4 hingga berhasil atau sampai semua titik kontak habis.
Menyerahlah, kembali
Vector3.zero
.
Ini sepertinya menangkap semuanya, tetapi semua raycast itu membuat saya mual, dan saya tidak yakin bagaimana menguji apakah ini bekerja untuk cukup banyak kasus. Apakah ada cara yang lebih baik?
EDIT Jika ini memang benar-benar keadaannya dengan tabrakan 3D, tinjauan umum mengapa dalam kasus umum akan sama disambut sebagai sesuatu yang spesifik untuk Unity.