Bu yazı Team From Beyond geliştirici blogunda yayınladığım girdinin Türkçesidir.
Oyunu Unity’de yapmaya başladığımdan beri kapı mekanikleri ile uğraşıyorum. Paralycid’in “tıkla ilerle” tarzında yavan mekaniklere sahip olmasını istemediğimden, oyuncuların kapılarla (ve diğer nesnelerle) etkileşiminin bir nebze gerçekçi ve kontrollü olmasını istemiştim. Amnesia: The Dark Descent ve Slender: The Arrival (bu da bir Unity oyunudur) aslında güzel örnekler sunmuştu. Ben de üç farklı mekanik hazırlayıp test ekibine yollamıştım.
1) Kapının yanına yaklaşıp fare tekerleğini kullanarak kapıyı açmak (açı bazlı)
2) Kapıya tıklayıp fareyi sağa sola hareket ettirerek kapıyı açmak (motor bazlı)
3) Bunu pek hatırlamıyorum ama sanırım farenin basılı kalma süresine göre işliyordu.
Hemen bir build alıp ekibe gönderdim ve hangisini daha çok sevdiklerini sordum. Hepsi de ikinci seçeneği söylediler, Amnesia tarzı olanı yani.
Bu tarz bir etkileşimin iyi ve kötü yönleri var. İyi yönleriyle, oyuncu kapıyı istediği kadar açabilir, dışarı göz atıp geri kapayabilir, kapı açtığını hissedebilir. Kötü yönleriyse, bu mekanik yeteri kadar hızlı değildir, çok fazla kodlama ve fizik öğeleri ile uğraşma gerektirir, ve en kötüsü de fizik öğeleri kırılabilir ve ya oyun çöker ya da düzeltilemez hatalar oluşur. Bana düşen, kötü yönleri tamamıyla yok edip iyi yönleri daha iyi yapmaktı.
İlk önce, kapıların fazla emek harcamadan akıcı bir şekilde açılıp kapanmasını yaptım. Tabi bu da, karakterin kapıya göre nerede durduğunun algılanmasını gerektiriyordu. Görece olarak kolaydı bu da, ve devamı da geldi. Ama sonra farkettim ki, oyuncu kapıyla hiç etkileşime girmeden yürüyüp gidebiliyor. Fizik etkileşimin ön göremediğim bir hatasıydı bu. Tabi bunun kullanımı da olabilirdi. Mesela oyuncu bir şeyden (?) kaçarken kapıları hızla açıp yoluna devam etmek zorunda kalabilir. Ama yine de, ilk etkileşimin olması gerekiyordu. Bunun kodlamasını da hallettikten sonra, oyuncunun kapıyla ilk etkileşiminden sonra (kapı kolunu tutup çevirme) hızla itip ilerleyebilmesi mümkün oldu. İstenmeyen durumlarda ise kapıyı yavaşça biraz açabiliyordu halen. Düşmanlar kapıyı yeterince zorlarlarsa kapı direk menteşesinden kopuyor ve hiçbir engel kalmıyordu. Görünürde her şey mükemmel işliyordu… Ta ki…
Bir gün, editörü açıp telefon ile ilgli bir kodu denerken kapıların açılmadığını farkettim. Fareyi hareket ettiriğimde kapıda bir hareketlenme olduğunu görebiliyordum. Ama kapı açılmıyordu. Karakter ile kapıyı ittiğimde açılıyor, ama geri kapandığında yine aynısı oluyordu. Sıkışmış gibi duruyorlardı. Bir kapıyı silip yerine yenisini koyduğumda çalıştı, ve ben de Unity’nin arabellek elemanlarının olaya müdahale ettiğini düşünüp tüm kapıları oyun başlarken yaratan bir kod yazdım ki, bundan etkilenmesin. Bu da olmadı.
İşin garibi, tüm kapılar bu şekilde çalışmıyordu. Kapıya bakış açısını değiştirdim, etkileşim aralığını değiştirdim, yer çekimini, fizik ayarlarını… Yok, yok, yok! Hiçbiri çalışmıyordu!
Öyle bir noktaya geldim ki, kapı mekaniğini komple değiştirmeyi bile düşündüm. Tıklayınca açılacak türden olacaklardı ve ne ben, ne oyuncular uğraşmayacaktı. Ama, böyle bir şey de oyunun atmosferine tamamen ters düşüyordu. Kabul edilemez olduğunu aşikâr olunca, umutsuzluğa kapıldım.
Forumları, soru & cevap sistemlerini aradım, menteşe ve fizik sistemlerini iyice araştırdım… Başkalarının sorunlarına sunulan çözümleri uygulamaya çalıştım, tüm kapıları yeni baştan yaptım… Yok, olmuyor. Hiçbir şey çalışmıyor, sorunu çözmüyor. Bir noktada artık sadece kapı mekaniğiyle çalışıyormuşum gibi gelmeye başladı. Ekip arkadaşlarım yavaş yavaş şikâyetlerini dile getirmeye başladı. Neden tüm vaktimi çalışmayan bir şey üzerine harcıyordum?
Ben de öylece bıraktım. Belki demo çıkmadan bir çözüm bulurum dedim.
Bir gün, animasyonları programlarken test leveline girdim ve hem editör hem oyun testi bir arada giderken yanlışlıkla kapılardan birine tıkladım. Kapının üzerinde hiçbir etkileşim olmadığı halde sürekli bir kuvvet uygulanıyordu. Tüm kodları yeniden gözden geçirdim ve sorunu buldum.
Problem, kapının yeterince itilmediği durumda ‘kapalı’ durumuna geri dönmesi için yazdığım koddaydı. Eğer ki sadece kapının kolu çevrildiyse ve/veya kapı sadece birkaç derece itildiyse, menteşe yaylarından dolayı kapının geri kapanması gerekiyor. Kapının durumunu ayarlamak nispeten kolay; ama bunu görsel olarak da desteklemek için kapıyı geriye iten bir kuvvet uygulayan bir kod yazmıştım. İşte bu kod, ben kapıyla etkileşime geçsem de, geçmesem de sürekli aktif idi. Dahası, bu uygulanan kuvvet, kapıyı açmak için uygulanan kuvvetten daha büyüktü ve sadece karakterin bedeniyle kapıyı itmesi veya düşmanların kapıyı zorlaması egale edebiliyordu.
Kodu değiştirmem bir dakikamı bile almadı ve tüm demo levelini test etmeye çıktım. Tüm kapıları kontrol etmem yaklaşık 20 dakikamı aldı (evet, bu sadece demo leveli) ve hepsi mucizevi bir şekilde sorunsuz çalışıyordu.
15 yaşımdan beri kod yazıyorum, son iki yıldır yazılım mühendisi olarak çalışıyorum. Kendimi öyle salak hissettim ki anlatamam. Kendi yaptığım şey beni ilerlemekten alıkoyuyordu. Team From Beyond’un tek programcısı olmam da bunun bir sebebi olabilir; ama yine de cesaret kırıcıydı. Neyse ki, “bu kapıların derdi ne?” şeklide aldığım soruları cevaplamış ve sorunu çözmüş oldum artık.
Başka problemler üretmek için kodlamaya geri dönme vakti.
Aslında herkesin başına gelebilecek tarzda bir olay başınıza gelmiş. Amnesia sisteminden hepimiz memnunuz, iyi ki vazgeçmemişsiniz.