Uzun süredir Godot 3.5'te takılıyordum, projelerimde collision_layer ve collision_mask ile boğuşmaktan kafayı yemiştim. "Bu nesne şunla çarpışsın, bunla çarpışmasın" derken bit mask hesapları yapıyor gibi hissediyordum. Godot 4'ün yeni fizik layer sistemi geldi diye sevindim, "sonunda" dedim. Meğerse yeni bir dil öğrenmek gibiymiş, ilk başta tamamen afalladım.
3.5'te her şey sayılardaydı. Layer'lar 1, 2, 4, 8, 16... diye giden bit değerleriydi. Mask için hangi layer'larla etkileşime girecekse onların toplamını yazıyordun. Küçük bir projede idare eder ama layer sayısı artınca, "Acaba 32 miydi yoksa 64 mü?" diye sürekli geri dönüp kontrol etmek zorunda kalıyordun. Bir de bunu birden fazla nesne için yapınca, kodun içi şöyle karışık ifadelerle doluyordu:
Kod:
collision_layer = 1
collision_mask = 1 | 4 | 16 # 1, 3. ve 5. layer'lar
Görsel bir fikrim yoktu, sadece sayılar vardı. PhysicsBody'leri ayarlarken defalarca hata yaptım.
Godot 4'te Project Settings -> Layer Names -> Physics 3D/2D kısmına gidip layer'larıma isim verebiliyorum! Artık "player", "enemy", "ground", "bullet" gibi. İnanılmaz derecede okunaklı.
Ancak, alışkanlık güçlü bir şey. İlk başta mask mantığının da değiştiğini anlamadım. 3.5'te mask, "ben kiminle çarpışayım"dı. 4'te ise her layer için iki sütun var: Layer ve Mask. "Layer" bu nesnenin ait olduğu kategori, "Mask" ise bu nesnenin hangi kategorideki nesneleri algılayacağı. Yani artık her şey görsel ve isim bazlı. Ama arayüzdeki onlarca checkbox'a ilk bakışta "Bu neyin nesi?" dedirtiyor.
En büyük "Aha!" anım şuydu: Bir Area2D'nin sadece "enemy"leri algılamasını istiyorsam, onun Layer kısmını boş bırakabilirim (yani hiçbir fiziksel katmanda olmasın). Sadece Mask kısmından "enemy"yi işaretliyorum. Bu, 3.5'teki eski mantıkla düşünürken kafamı karıştıran en önemli noktaydı. Yeni sistem aslında çok daha esnek ve güçlü.
Sonuç olarak, Godot 4'ün fizik layer sistemi kesinlikle bir nimet. Kod okunabilirliği ve proje yönetimi inanılmaz derecede arttı. Ancak, eski alışkanlıkları kırmak ve yeni arayüzdeki mantığı tam kavramak bir iki küçük projeyi berbat etmemi gerektirdi. Şaka gibi ama, KinematicBody'nin yerini alan CharacterBody2D ile bu layer'ları birlikte kullanmayı öğrenmek ayrı bir maceraydı!
Siz de Godot 3.5'ten 4'e geçerken böyle "eski sistem daha iyiydi" deyip sonra "aa aslında yeni sistem harikaymış" dediğiniz anlar yaşadınız mı? Özellikle fizik çarpışmalarında başka hangi püf noktaları keşfettiniz?