Kafayı yiyecektim dostlar. Adam akıllı bir platform oyunu yapıyorum, karakterim zıplıyor, koşuyor, her şey güzel. Ta ki en basit bir platforma inene kadar. Dokunduğu anda, sanki platform bir trambolinmiş gibi, karakterim ışık hızında haritanın dışına, sonsuz boşluğa fırlıyor. "Game Over" yazısını görmekten gözlerim kanadı artık. Meğerse sorun, fizik motorunun en temel kurallarında saklıymış.
İlk başta, Rigidbody ayarlarımı suçladım. Mass'i 1000 yaptım, yerçekimini artırdım, olmadı. Collider'ların iç içe mi geçiyor diye baktım, hayır. Sonra, o meşhur Physics Manager penceresine daldım. Ve işte o an... "Layer Collision Matrix" diye bir şey var ya, orada katmanların birbirleriyle çarpışıp çarpışmayacağını belirliyorsun.
Kodumda karakterimin katmanını Player, platformların katmanını ise Ground yapmıştım. Sorun yok gibiydi. Ama bir de karakterimin altına eklediğim, zıplama kontrolü için kullandığım görünmez "ayak sensörü" GameObject'i vardı. Onun katmanı ise varsayılan olarak Default kalmıştı. İşte felaket burada başladı.
C#:
// Bu küçük kod parçası, çarpışmayı algılıyordu ama...
void OnCollisionEnter(Collision collision)
{
isGrounded = true;
}
Default katmanı ile Ground katmanının çarpışma matrix'te işaretli OLMADIĞINI fark ettim! Yani aslında fizik motoru, "ayak sensörüm" ile "platform" arasında bir çarpışma olmaması gerektiğini düşünüyordu. Ama Rigidbody hareket ediyor, çarpışma olmaması gereken bir yüzeye anlık olarak girip çıkıyor ve motor bu anormalliği "Bunu itmem lazım!" diye yorumlayıp karaktere akıl almaz bir kuvvet uyguluyordu. Şaka gibi ama, sorun buydu.
Çözüm inanılmaz basitti. Edit -> Project Settings -> Physics kısmına gidip, Layer Collision Matrix'te Default katmanı satırı ile Ground katmanı sütununun kesiştiği yerdeki kutucuğa tıkladım. Bir tik işareti koymak, her şeyi düzeltti. Karakterim artık sakin sakin platformlara iniyor, uzay istasyonuna dönmüyor.
Moral: Fizik motoru bazen sinsi çalışıyor. Özellikle katmanları (Layers) ve onların birbirleriyle etkileşimini gözden kaçırmamak lazım. Collider'lar doğru, Rigidbody doğru ama sonuç yanlışsa, ilk bakacağın yer burası olmalı.
Siz de benzer bir "fırlatılma" veya beklenmedik fizik davranışı yaşadınız mı? Ya da Physics Layer'lar konusunda daha temiz çalışmak için başka ipuçlarınız var mı? Yorumlara yazın, hep birlikte öğrenelim.