Kafayı yiyecektim. Oyun runtime'da çöküyor, loglar kıpkırmızı ve tek hata mesajı: "Accessed None trying to read property". "Called on None" diye bağırıyor bana. Saatlerce debug ettim, Cast'leri kontrol ettim, pointer'ları tek tek inceledim. Meğerse sorun, en temel şeylerden birinde, Blueprint Interface'i implemente etmeyi unutmamdaymış. Şaka gibi ama, gerçek.
Hatayı Arayış Çılgınlığı
Her şey, bir karakterimin belirli bir türdeki nesneyle etkileşime girmesiyle başladı. Mantık basitti: Eğer hedef nesne IInteractable interface'ini implemente ediyorsa, Interact fonksiyonunu çağır. Ben de güzelce yazdım:
Ama hayır! Runtime'da HitActor valid görünse bile, o satıra gelince oyun patlıyordu. "Bu actor bu interface'i implemente etmiyor olabilir mi?" diye düşündüm, ama Blueprint'te eklediğimden emindim. Ta ki...
Meğerse Unutmuşum!
Blueprint editörüne geri döndüm, etkileşime girecek olan nesnemin Blueprint'ini açtım. Class Settings kısmına baktım. Arayüzler (Interfaces) bölümü bomboştu! Interface'i yaratmıştım, fonksiyonunu tanımlamıştım, ama o kritik adımı atlamıştım: Blueprint'e gidip "Add Interface" butonuna basmayı unutmuşum. Yani kod, interface'in varlığını kontrol ediyordu, ama nesne o interface'i hiçbir zaman "benimsiyor" değildi. Bu yüzden ImplementsInterface check'i başarısız oluyor ve ben Execute_Interact'i None üzerinde çağırmaya çalışıyormuşum gibi bir hata alıyordum.
Çözüm ve Alınan Ders
Çözüm basitti: Blueprint editöründe, Class Settings -> Interfaces kısmından ilgili interface'i eklemek. Ama asıl ders, Unreal Engine'in bazen hata mesajlarının çok dolaylı olabileceği. "Called on None" diye bağıran bir hata, aslında "Bu interface implemente edilmemiş" demek istiyor olabilir. Artık her yeni interface oluşturduğumda, ilk iş onu kullanacak Blueprint'lere eklemek oluyor.
Siz de böyle "en basit şeyi unuttum" dedirten, saatlerinizi yutan saçma hatalarla karşılaştınız mı? Unreal'de interface kullanırken başka hangi tuzaklara düşüyorsunuz?
Her şey, bir karakterimin belirli bir türdeki nesneyle etkileşime girmesiyle başladı. Mantık basitti: Eğer hedef nesne IInteractable interface'ini implemente ediyorsa, Interact fonksiyonunu çağır. Ben de güzelce yazdım:
C++:
if (HitActor->GetClass()->ImplementsInterface(UInteractableInterface::StaticClass()))
{
IInteractableInterface::Execute_Interact(HitActor);
}
Ama hayır! Runtime'da HitActor valid görünse bile, o satıra gelince oyun patlıyordu. "Bu actor bu interface'i implemente etmiyor olabilir mi?" diye düşündüm, ama Blueprint'te eklediğimden emindim. Ta ki...
Blueprint editörüne geri döndüm, etkileşime girecek olan nesnemin Blueprint'ini açtım. Class Settings kısmına baktım. Arayüzler (Interfaces) bölümü bomboştu! Interface'i yaratmıştım, fonksiyonunu tanımlamıştım, ama o kritik adımı atlamıştım: Blueprint'e gidip "Add Interface" butonuna basmayı unutmuşum. Yani kod, interface'in varlığını kontrol ediyordu, ama nesne o interface'i hiçbir zaman "benimsiyor" değildi. Bu yüzden ImplementsInterface check'i başarısız oluyor ve ben Execute_Interact'i None üzerinde çağırmaya çalışıyormuşum gibi bir hata alıyordum.
Çözüm basitti: Blueprint editöründe, Class Settings -> Interfaces kısmından ilgili interface'i eklemek. Ama asıl ders, Unreal Engine'in bazen hata mesajlarının çok dolaylı olabileceği. "Called on None" diye bağıran bir hata, aslında "Bu interface implemente edilmemiş" demek istiyor olabilir. Artık her yeni interface oluşturduğumda, ilk iş onu kullanacak Blueprint'lere eklemek oluyor.
Siz de böyle "en basit şeyi unuttum" dedirten, saatlerinizi yutan saçma hatalarla karşılaştınız mı? Unreal'de interface kullanırken başka hangi tuzaklara düşüyorsunuz?