mrtcnaslnts

Aktif üye
8 Ara 2019
608
2
44
28
Haritanın belli yerlerine düşman ekledim. Oluşturduğum spline Actorunu de AI içersindeki değişkene pick actor from scene şeklinde tanımladım. Oyun balşladığında sahnede olan düşman AI belirlenen spline çizgisinde hareket ediyor. Buraya kadar sorun yok ancak oyuncu öldüğünde düşman AI yeniden doğması gerektiği için orda çözümsüz kaldım. Düşman AI haritaya sürüklemeden Event ile spawn etmem lazım diye düşündüm ve spawn sistemini Game mode içerisinde çalıştırdım ve oyuncu ölüp tekrar doğduğunda diğer düşmanlar da respawn olcak yani o eventi tetiklicek bu da tamam. Peki ben bu spawn olan düşman AI değişkeninin içerisine sahnedeki spline'i nasıl pick edeceğim? Üstelik haritada da 10 tane spline mevcut.
 
Çözüm
Mantık olarak dediğini anladım. Ama bunu UE tarafında işleme dökme olayı esas mesele :D UE de çok iyi sayılmam.
Şimdi benim burda anlamadığım nokta şu. Spline Actoru 1 tane zaten. Ben bu 1 tane olan actoru sahneye koydukça çoğalıyor ve numaralanıyor. Level içerisine belli noktalara bu actor splinei koyup bu splineleri zemine göre şekillendiriyorum veya gezinmesini istediğim güzergaha göre ayrı ayrı şekil kazandırıyorum. Bir noktada 2 tane NPC sabit beklerken başka bir noktada 2 tane NPC devriye atıyor. Get all actor of class ile tüm spline actoru topluyorum evet ama asıl mesele ondan sonrası. :D
Farklı bi yöndem olarak, NPC spawn ederken aynı zamanda spline actoru de mevcut NPC spawn noktasına spawn edip patrol değişkenine öyle...
Eğer spawn olan AI lar hepsi content browser da ayrı ayrı BP ler ise, direk BP içerisinde SplineComponent kullanarak hepsine kendine özel bir spline ataya bilirsin. Eğer aynı AI BP yi spawnlıyorsan bir sistem kurman lazım. Mesela şöyle yapabilirsin. Her AI oyun dünyasına girdiğinde (BeginPlay) sahnedeki var olan tüm spline actor leri bulur (GetAllActorsOfClass). Bunu yaptığında her spawn olan AI haritadaki tüm spline actor lere ulaşmış olacak. Ancak burada iş bitmiyor. Eğer her şey rastgele usülüne göre yaptıysan, her AI bu spline listesi içersinden kendisine en yakın spline ı bulup onu kendi değişkenine atayabilir. Bunun için en yakını bulan bir algoritma kurman gerekecek.
Yukarıda anlattığım sistemde her spawn olan AI kendine en yakın olan spline ı alacağından eğer aynı spline 3 AI için en yakın olan ise hepsi aynı splin a gidip aynı yerde gezecektir. Oyunun özelliklerine göre uygun olup olmadığına senin karar vermen gerekiyor.
Başka bir yol GameMode da spawn ettiğin yerde o yarattığın yeni AI a hemen sahneden bir spline seçip atayabilirsin. Bunun için spawn yapmadan önce yine GetAllActorsofClass ile spline ları bulabilir SpawnActor komutunu çalıştırdıktan sonra değişkenine atayabilirsin.
Başka bir yöntem ise eğer spawn_point_actor tarzında levele koyup spawn yerlerini belirteceğin bir actor yaptıysan (Aslında yapmadıysan da büyük ihtimalle yapmayı düşünmen lazım.) AI spawnlarken lokasyon yerine bu actorlerden birini seçeceksin. Bu actorlerin her birinde bir spline component ile gerekli spline atanmış olacak. Yani bu actorler oyuncunun ölümüyle ölüp canlanan şeyler değiller. Sürekli orada kalacaklar. AI bunlardan birini seçip spawn olduğunda aynı zamanda seçtiği bu actorün Spline ını kendisine atayacak. Bu sistemde aynı spline a iki AI ın gelme şansı da yok.
Duruma göre daha çok yöntemler buluna bilir. Mesela sistem rastgele sistem değilse, actor tag ler kullanarak belli bir AI ın belli bir spline ı bulması sağlanabilir.
 
Spawn olan actorler aynı hocam. Patroll Spline actoru da yine 1 tane.
Spawn olan NPC Actorunun içinde Patroll değişkeni var. Haritaya eklediğim Patroll spline'lar ise get all actor of class ile bulunuyor get ile de NPC Actoründeki değişkene set ediyorum. Düşündüm ve böyle bişy buldum get alanına haritadaki Patroll numarasını yazarsam olur diye düşündüm. Kısmen oldu ama bir problem var.

Get kısmına 1 yazdığımda NPC 3 numaralı Patroll a gidiyor 3 yazdığımda 5 e, 5 yazdığımda 6ya, 6 yazdığımda 12ye vs vs diye devam ediyor. Çok acayip. Ne yaptım bilmiyorum :D Aslında görseli örnek olarak paylaştım ne ekleyebiliriz vs


SPAWN.png
 
Son düzenleme:
GetAllActorsOfClass haritadaki tüm belirttiğin actor leri toplar ama sen hangi sıra ile toplayacağını bilemezsin. Senin bir numaralı 3 numaralı 5 numaralı diye anlattığın sıra numaralırını nasıl verdin bilmiyorum ama elindeki UE nin bu sırayı bilmesine imkan yok aynen benim bilmediğim gibi. Senin orda get kısmına yazdığın index sıra numarası. Ancak biraz önce belirttiğim gibi GetAllActorsOfClass ın bu listeyi nasıl sıraladığını bilmen ve kontrol etmen imkansız. Eğer anlamadıysan bir örnekle anlatayım:
Okul müdürü nöbetçi öğrenciye tüm 3 ncü sınıf öğrencilerini kapısında sıraya dizmesini ve hepsi ile sıra ile görüşeceğini söylüyor. Nöbetçi öğrenci topluyor "topladım" diye de haber veriyor. Müdür "birinci sıradaki gelsin" dediğinde evet ilk sırada bekleyen gelir. 5 nci sıradaki gelsin dediğinde 5 nci sıradaki gelir. Ama oraya ilk kim geldiyse o 1 nci sıradadır, 5 nci olarak kim geldiyse o 5 nci sıradadır. Kim olduğunu müdür olarak tahmin edemezsin. Ben Ahmetin ilk gelmesini istemiştim, 5nci de Selim gelseydi keşke diyorsun sen. Daha doğrusu isim söylemiyorsun ama bir numara vermişsin ya da düşünmüşsün isim olarak onları söylüyorsun. GetAllActorsOfClass böyle bir şey yapamaz. O rastgele toplar.
Eğer istediğin sırayı belli bir kurala göre oluşturmak istiyorsan bunu kendin yapmalısın. Okullarda ID numarası verildiği gibi her spline a bir ID numarası verebilirsin. Sonra GetAllActorsOfClass hepsini topladıktan sonra bu ID numarasına göre tekrar sıraya dizersin. Sonra dizdiğin sıraya göre ID1 olan birinci sıraya ID si 5 olan 5nci sıraya yerleşmiş olur. Ondan sonra istediğin spline ı bekleyebilir get ile de istediğini belirleyebilirsin.
 
  • Beğen
Tepkiler: mrtcnaslnts
Mantık olarak dediğini anladım. Ama bunu UE tarafında işleme dökme olayı esas mesele :D UE de çok iyi sayılmam.
Şimdi benim burda anlamadığım nokta şu. Spline Actoru 1 tane zaten. Ben bu 1 tane olan actoru sahneye koydukça çoğalıyor ve numaralanıyor. Level içerisine belli noktalara bu actor splinei koyup bu splineleri zemine göre şekillendiriyorum veya gezinmesini istediğim güzergaha göre ayrı ayrı şekil kazandırıyorum. Bir noktada 2 tane NPC sabit beklerken başka bir noktada 2 tane NPC devriye atıyor. Get all actor of class ile tüm spline actoru topluyorum evet ama asıl mesele ondan sonrası. :D
Farklı bi yöndem olarak, NPC spawn ederken aynı zamanda spline actoru de mevcut NPC spawn noktasına spawn edip patrol değişkenine öyle set edeyim dedim oldu evet ama bunu da sadece idle rolündeki NPC ler için mümkün hale geliyor fakat gezinen için yine duvara tosluyorum.
Ben istiyorum ki. Örnek veriyorum bir okul dşünelim. Bahçesine 3 5 tane gezinen spline, bahçe kapısına 2 tane idle spline, okulun içerisine ayrı ayrı gezinen splinelar ekleyeyim ama bu splineları Sahne içerisinde düzenleyeyim ve bu tek bir spline actor olsun. Sahnedeki ayrılmış olan splineları da Spawn edeceğim NPClerin görev alanlarına göre set edeyim.
Sen bana işin mantığını olması gerekeni vs anlatabilirsin anlamamda da sorun yok ama pratiğe dökme kısmında bocalıyorum. Yani burdan ancak bu kadar destek olabiliyorsun seni de anlıyorum yine de teşekkürler :D
 
Son düzenleme:
Mantık olarak dediğini anladım. Ama bunu UE tarafında işleme dökme olayı esas mesele :D UE de çok iyi sayılmam.
Şimdi benim burda anlamadığım nokta şu. Spline Actoru 1 tane zaten. Ben bu 1 tane olan actoru sahneye koydukça çoğalıyor ve numaralanıyor. Level içerisine belli noktalara bu actor splinei koyup bu splineleri zemine göre şekillendiriyorum veya gezinmesini istediğim güzergaha göre ayrı ayrı şekil kazandırıyorum. Bir noktada 2 tane NPC sabit beklerken başka bir noktada 2 tane NPC devriye atıyor. Get all actor of class ile tüm spline actoru topluyorum evet ama asıl mesele ondan sonrası. :D
Farklı bi yöndem olarak, NPC spawn ederken aynı zamanda spline actoru de mevcut NPC spawn noktasına spawn edip patrol değişkenine öyle set edeyim dedim oldu evet ama bunu da sadece idle rolündeki NPC ler için mümkün hale geliyor fakat gezinen için yine duvara tosluyorum.
Sen bana işin mantığını olması gerekeni vs anlatabilirsin anlamamda da sorun yok ama pratiğe dökme kısmında bocalıyorum. Yani burdan ancak bu kadar destek olabiliyorsun seni de anlıyorum yine de teşekkürler :D
Bundan sonrası programlama bilmek le alakalı ne yazık ki. Dediğin gibi bir noktadan sonra yardımcı olamıyorum. Ama son anlattıklarından anladım ki, level içine koyduğun spline ların isimlerine eklenen numaraların bir anlamı olduğu zannındasın. O numaraların hiç bir değeri ya da anlamı yok. Tek fonksiyonları nesnelerin aynı isimde olmamalarını sağlamak. Yani oraya Spline1 demek yerine SplineAbuzittin de denebilir ve hiç bir şey değişmezdi. Dolayısı ile o numaraları unutabilirsin. Sana son olarak buradan anlatabileceğim ve senin de anlayabileceğin bir yöntem tavsiye edeyim.
1. SpawnPoint adında actor sınıfından bir BP yap. Bunun içine bir SceneComponent parent olarak, 1 BillboardComponent level de gözüksün diye, ve son olarak bir tane de SplineComponent koy. Bunu yaptıktan sonra Level içine spline koymak yerine bu yeni hazırladığın BP leri koy. Spline componentlarını outliner/details panel den seçerek sahne içinde istediğin gibi düzenle.
2. AI spawn etme işini GameMode dan al bu yeni yaptığın BP içine koy. Yani level deki her SpawnPoint actor u kendisine bir AI spawn etsin. Spawn ettikten hemen sonra SplineComponent ındaki spline ı AI daki değişkene set etsin.
3. Sonra karakter öldüğünde herhangi bir yerden karakterden olabilir game mode dan olabilir nereden istersen bu SpawnPoint actorlerini topla ve Spawn fonksiyonunu çalıştırt.

Bütün bunlardan daha da kısası şu olabilir. Karakter ölünce OpenLevel ile haritayı yeniden başlat. sen nasıl kurduysan herşey sıfırdan başlayacaktır. Bu sistem de sadece karakterin öldüğü yerden başlamasını istiyorsan öldüğünde GameInstance gibi bir yere (ya da save game) ölüm yerini kaydedip level başaladığında orada başlamasını sağlamak zorundasın.
Neyse ancak bu kadar yardım edebilirim. Kolay gelsin.
 
  • Love
Tepkiler: mrtcnaslnts
Çözüm
Yeni Actor değil de mevcut Spline actor içerisine yaptım dediğin sistemi miss gibi oldu. Karakter ölüp spawn olduğunda da, karakter iyileşme noktasına girdiğinde de mapteki NPCler destroy olup Spline actor içerisindeki Spawn Event çalışıyor düşman yeniden spawn oluyor. Map yeniden yükleme ya da save sistemi gibi durumlara gerek bile yok. Teşekkürler
 
Son düzenleme: