Unity'nin çarpışma olayı, gerçekleşen çarpışma hakkında size bazı bilgiler veren bir Çarpışma nesnesi verir ( vuruş normalleri olan ContactPoints listesi dahil ).
Ama elde edemeyeceğiniz çarptığınız çarpıştırıcının yüzey normalleri. İşte açıklamak için bir ekran görüntüsü. Kırmızı çizgi geldi ContactPoint.normal
ve mavi çizgi geldi RaycastHit.normal
.
Bu, Unity'nin basitleştirilmiş bir API sağlamak için bilgi gizleme örneği mi? Yoksa standart 3D gerçek zamanlı çarpışma algılama teknikleri sadece bu bilgileri toplamıyor mu?
Ve sorunun ikinci kısmı için, bir çarpışma için normal bir yüzey elde etmenin kesin ve nispeten etkili bir yolu nedir?
Yeniden yayınlamanın size yüzey normalleri verdiğini biliyorum, ancak tüm senaryolar için bunu gerçekleştirmek için birkaç tane raycast yapmam gerekiyor gibi görünüyor (belki bir temas noktası / normal kombinasyon ilk oyuncudaki çarpıştırıcıyı özlüyor, ya da belki de tüm ortalamaları yapmanız gerekiyor en iyi sonucu almak için temas noktalarının normalleri).
Mevcut yöntemim:
Collision.contacts[0].point
İsabet normal boyunca yedekleyinRaycast için olumsuz vuruş normal
float.MaxValue
,Collision.collider
Bu başarısız olursa, 1. ve 2. adımları negatif olmayan normal ile tekrarlayın
Bu başarısız olursa, 1-3 arasındaki adımları
Collision.contacts[1]
Başarılı olana kadar veya tüm temas noktaları tükenene kadar 4'ü tekrarlayın.
Vazgeç, geri dön
Vector3.zero
.
Bu her şeyi yakalıyor gibi görünüyor, ama tüm bu ırkçılar beni rahatsız ediyor ve bunun yeterli durumlar için nasıl çalıştığını test edemiyorum. Daha iyi bir yol var mı?
DÜZENLEME Bu gerçekten 3D çarpışmada olan şeyse, genel durumda neden Unity'ye özgü bir şey kadar hoş karşılanır.