omer.hatay

Yeni üye
2 May 2019
182
14
0
24
(34) İstanbul Avrupa
İki tane hareketli nesnem var oyunda, biri mermi biri de düşman Unit. Unit oyuna başladığı gibi oyuncuyu takip ediyor ona çarpıp yok oluyor. Mermi sürekli oyuncudan ateşleniyor ve ilerlerken Unit ile çarpışırsa yok oluyor. Garip olan taraf çarpıştıkları anda yok olması gereken mermi, çarpıştığı Uniti birkaç birim geriye doğru itiyor. İkinci garip olan taraf ise, benim bir movement componentim var, kendi ihtiyaçlarım doğrultusunda yarattım. Unitler bu movement componenti kullanıyor ve oyun başladıkları gibi yapay zeka sistemi yoluyla bu movement componente sürekli olarak oyuncunun konumu gönderiliyor ve movement componentte bulunan bir fonksiyon her tick başına kendi sahibini belli bir miktar ileri taşıyor. Ayrıca sahibinin rotasyonunu da oyuncuya bakacak şekilde ayarlıyor. Ancak mermi bile birkaç unit öldürdükten sonra oyunu durdurduğunuz zaman hata alıyorsunuz. Hatada BU. Aşağıda gösterdiğim resimde, setactorlocation ile setactorrotation ayrı, eğer bunları birleştirip, setactorlocationandrotation nodeunu kullanırsam hata vermiyor ama ayırınca bu hatayı veriyor.  
96zl74b.png
 
Uniti geriye atma olayı için öldürülme nodlarının resmini koyabilirsen anlarız.

Aldığın hata da şu: bir şeyi destroy ladığın zaman o oyundan görüntü olarak kalkıyor ama hemen silinemiyor. Garbage collector denen birşey var o bir miktar süre sonra oyundan tamamen silinmesi gereken şeyleri tamamen siliyor. Sen destroy dediğinde oyunda görmüyorsun ama oyunun arka planında hala var. 

Sen unitlerin listesini tutuyorsun ya bir aktörde update etmek için. İşte bu destroy edilmiş ama hala silinmemiş aktöre ulaşmaya çalışıyor. Ulaşıyor ama o aktör o anda garbage collectorun silmesi için bekliyor. O yüzden o aktörde herhangi bir değişiklik yapamıyorsun. Aslında bir hata değil bu. Sana diyor ki silinmekte olan bir aktöre erişiyorsun haberin olsun diyor.

Bu hatayı önlemek için update etmeden önce aktörü çağırdığında is valid nodunu kullanman. Eğer pending kill ise yani silinmeyi bekliyorsa false olarak dönecek ve fonksiyonları çağırmayacak, hata da almayacaksın.
 
Merminin çarptığı component capsule ise bunun overlap dışında önüne geçmenin yolu yok. Zaten "Use CCD" açık olmadığı müddetçe hızlı objeler her şekilde birbirinin içinden geçecek. Use CCD enable yapıp merminin de capsule dışında bbir alt component ile çarpışmasını sağlarsan istdiğin şeye ulaşman mümkün. Düşman sayın ve mermi oranı fazla ise en sağlıklısı merminin collision'ını komple kapatıp her tick merminin önceki frame ile şu anki frame lokasyonları arasında sphere trace uygulatman olur.