serhatwxe

Unreal MVP
3 Ocak 2016
317
1
54
28
(34) İstanbul Avrupa
Selamlar! Çok uzun bir zamandır buralarda yoktum, geldim. Yabancı forumlarda yanıt bulamadım.
Sorunum şu, oyun multiplayer olduğu için dışarıdan fullbody şeklinde farklı karakter, içeriden ise farklı mesh (sadece kollar/FPS) olarak gözüken bir karakterim var. Yani bir Character Blueprint'in içinde FPS mesh + FullBody karakter var. 

Amacım AimOffset eklemek. Ekliyorum, TPS şeklinde yani fullbody karakter için düzgün çalışıyor. Biliyorsunuz AimOffset/TurnInPlace sistemleri için "Use Controller Rotation Pawn" ve "Use Controller Desired Rotation" seçenekleri pasif olmalı fakat oyun FPS bir oyun olduğunan bu seçenekler FPS için aktif olmalı. Karakter nereye bakarsak oraya doğru kamerayı döndürüp oraya gidebilmesi için.  

Multiplayer bir FPS oyunda dışarıdan başkalarının göreceği fullbody karakter için AimOffset ve TurnInPlace nasıl ekleyebilirim?
 
Network oyununda senin TPS karakterin diğerlerinin oyununda ROLE_SimulatedProxy olacak. FPS kolların ise kendi tarafında ROLE_AutonomousProxy olacak. Bunun haricinde görünen bir şey olmayacak. Dolayısı ile AimOffset sadece SimulatedProxy olduğunda gözüken TPS animation graph ı üzerinde çalışacak. Oda PlayerController Rotation a bağlı. Bunu gerçek kullanıcı/oyuncudan replicate ile SimulatedRoxy ye aktarman gerekecek. SimulatedProxy de FPS kolların gözükmeyeceğinden sorun yok. AutonomousProxy de ise sadece FPS kolların gözükecek dolayısı ile aim offsete gerek yok. 
Yukarıda bahsettiğin ayarları network rolüne göre de değiştirebilirsin BeginPlay de. Ancak buna da gerek yok. Farklı Anim Graph lar verirsen sorun çözülür. Yada aynı AnimGraph içerisinde iki duruma göre farklı branch yapabilirsin.

https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/Actors/Roles/
 
Biraz karmaşık olduğundan anlatmak da güçlük çekiyorum kusura bakmayın. Sorunum aslında bu değil. Yani replicated/yansıtma kısmında takılmıyorum ben o bir sonraki aşama. Hatta oyunun offline olduğunu düşünün.
Video: 
Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
 
Aslında o bir sonraki aşama değil bir önceki aşama. Sorun burda. Ben de onu anlatmak istiyorum. Eğer maksadın sonuç olarak multiplayer oyun yapmaksa böyle düşünmek zorundasın. Herşeyi sırası ile halletmek zorundasın. SinglePlayer gibi düşünüp Multiplayer e çevirmek, multiplayer oyun geliştirirken yapacağın en kötü hareket olur.
   Ama sen yine de single player da nasıl çözülür onu merak ediyorsan:
   Bu seferde neden iki mesh in aynı anda görünmesini istiyor olabilirsin. İkisini aynı anda görmek istemeyeceğini tahmin ediyorum. Bu durumda o checkbox ayarları (BP de ya da C++ ta farketmez) runtime da yani kodda dinamik olarak değiştirebilirsin. Yani mesela C ye basınca FPS moduna geçmesini istiyorsan örneğin, C ye basınca mesh lerden birini saklayabilir, bunun yanında o checkbox ları istediğin gibi on ya da off hale getirebilir, tekrar C ye basıldığında check box ları tekrar geriye döndürebilirsin. Bu durumda da diğer mesh in görünür olması gerek tabi.
  Eğer herhangi bir sebeple ikisinin de video da bizim gördüğümüz gibi aynı anda görünmesini istiyorsan, FPS mesh'i OnTick fonksiyonunda manuel yani kod ile döndürmen gerekecektir. Yani BP tick fonksiyonunda SetComponentRotation ya da bunun gibi bir fonksiyonla mesh i manuel döndürürsün. 
  Ama tekrar hatırlatmam gerekiyor: Wğer son istediğin bir multiplayer oyun ise bu seçeneklerin hepsi gereksiz. O zaman bir önceki mesajımda ki gibi yapman gerekiyor ki herkes öyle yapıyor zaten. Bu oyunun sadece bu kısmını değil bir sürü başka şeyide etkileyecek. Multiplayer için multiplayer düşünmek zorundasın.
 
erginegider' Alıntı:
Aslında o bir sonraki aşama değil bir önceki aşama. Sorun burda. Ben de onu anlatmak istiyorum. Eğer maksadın sonuç olarak multiplayer oyun yapmaksa böyle düşünmek zorundasın. Herşeyi sırası ile halletmek zorundasın. SinglePlayer gibi düşünüp Multiplayer e çevirmek, multiplayer oyun geliştirirken yapacağın en kötü hareket olur.
   Ama sen yine de single player da nasıl çözülür onu merak ediyorsan:
   Bu seferde neden iki mesh in aynı anda görünmesini istiyor olabilirsin. İkisini aynı anda görmek istemeyeceğini tahmin ediyorum. Bu durumda o checkbox ayarları (BP de ya da C++ ta farketmez) runtime da yani kodda dinamik olarak değiştirebilirsin. Yani mesela C ye basınca FPS moduna geçmesini istiyorsan örneğin, C ye basınca mesh lerden birini saklayabilir, bunun yanında o checkbox ları istediğin gibi on ya da off hale getirebilir, tekrar C ye basıldığında check box ları tekrar geriye döndürebilirsin. Bu durumda da diğer mesh in görünür olması gerek tabi.
  Eğer herhangi bir sebeple ikisinin de video da bizim gördüğümüz gibi aynı anda görünmesini istiyorsan, FPS mesh'i OnTick fonksiyonunda manuel yani kod ile döndürmen gerekecektir. Yani BP tick fonksiyonunda SetComponentRotation ya da bunun gibi bir fonksiyonla mesh i manuel döndürürsün. 
  Ama tekrar hatırlatmam gerekiyor: Wğer son istediğin bir multiplayer oyun ise bu seçeneklerin hepsi gereksiz. O zaman bir önceki mesajımda ki gibi yapman gerekiyor ki herkes öyle yapıyor zaten. Bu oyunun sadece bu kısmını değil bir sürü başka şeyide etkileyecek. Multiplayer için multiplayer düşünmek zorundasın.


Öncelikle teşekkürler. Hayır amacım bir tuşa basınca FPS moda geçmesi de değil. Basit örnek olsun diye Zula'yı düşünebilirsiniz. Bizi misal ceketli karakter olarak görüyorlar fakat FPS görünümde kıyafetimiz yeşil. Ben benzer sistemi Unreal'da yapmaya kalksam bir Character Blueprint içerisine bir FPS mesh, bir de tam vücut karakter koyarım. FPS Meshi sadece sahip görecek (owner see), tam vücudu ise diğer clientler. Bu sistemi yaptım test ettim gayet iyi çalışıyor. (Videoda anlaşılsın diye tam vücut karakteri ileri taşıdım, hepsini visible yaptım o yüzden garip görüntü var) Fakat en basit AimOffset kısmında bile takılınca dediğiniz doğru olduğunu biliyorum. Sizin dediğiniz gibi yapacağım. Haklısınız her şeyi doğru şekilde yapmak gerekiyor. Fakat pek anlamadım. Bir Blueprint içerisinde 2 mesh mi koyacağım yoksa ayrı ayrı 1 TPS_BP 1 FPS_BP karakter mi olacak? Eğer öyleyse TPS'i C++'a girişmeden ROLE_SimulatedProxy, FPS'i ise ROLE_AutonomousProxy olarak nasıl ayarlayabilirim? Ki bunların aynı noktada başlayıp spawnlanma durumu da var. Tabii eğer sizi doğru anladıysam.

[img=900x450]https://iasbh.tmgrup.com.tr/4ff288/...em-gereksinimleri-tk1-1598865202292.jpg[/img]
 
Bende ikiside var ama tam olarak senin anlattığın şekilde yok herhalde.

Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.

Böyle bir şeyden mi bahsediyorsun ? Çünkü ben de normalde o kontrolleri açıyorum fps geçince kapatıyorum ve karşıdada kapattıgım gözüküyor ama karşıda kapattığım gözükmesin diyede ayarlayabilirim onu istersme. O da tamamen multicast ile yapıp yapmaman ile alakalı.
Ama senin istediğin şey dönerken bacaklarını döndürerek dönmesi olayı mı ? Mesela mouseyi full sağa çevirince karakter kendi etrafında sağa doğru dönecek ?
 
Use Controller Desired Rotation açık olmasına gerek olmadan Add movement input kısmına camera'nın forward vector'u sağa-sola gitmek içinde right vector yönünde parametreler versen çözülür diye düşünüyorum ama zaten sen düşünüp denemişsindir belki önceden. Neden olmadı eğer denediysen?
 
emin2045' Alıntı:
Use Controller Desired Rotation açık olmasına gerek olmadan Add movement input kısmına camera'nın forward vector'u sağa-sola gitmek içinde right vector yönünde parametreler versen çözülür diye düşünüyorum ama zaten sen düşünüp denemişsindir belki önceden. Neden olmadı eğer denediysen?

Hocam bu çok mantıklı, AimOffset falan her şey düzgün çalışıyor ama karakterin direction'u hariç. Yani istenilen direction'a gidiyor ama arkası dönük koşarak gidiyor .d (Kamera ile Y yönüne bakıp, Y yönüne gidip, Meshin X yönüne bakması gibi)
Bunu kurcalarsam bir şekilde çözerim ama bu sorun sadece Client kısmında var. Server kısmında ise sanki Desired açıkmış gibi davranıyor ve hiçbir ayar mayar dediğiniz şeyleri yapmamışım gibi eski halindeki şekilde davranıyor.


leonscottkfm' Alıntı:
Bende ikiside var ama tam olarak senin anlattığın şekilde yok herhalde.


Böyle bir şeyden mi bahsediyorsun ? Çünkü ben de normalde o kontrolleri açıyorum fps geçince kapatıyorum ve karşıdada kapattıgım gözüküyor ama karşıda kapattığım gözükmesin diyede ayarlayabilirim onu istersme. O da tamamen multicast ile yapıp yapmaman ile alakalı.
Ama senin istediğin şey dönerken bacaklarını döndürerek dönmesi olayı mı ? Mesela mouseyi full sağa çevirince karakter kendi etrafında sağa doğru dönecek ?

Oyun güzel gözüküyor.
Evet başta istediğim AimOffset yerine TurnInPlace'idi. Çok basit, yapılıyor ama benim durum çok farklı, 2 ayrı mesh var. Senin yaptığın sistemde kamera TPS'in kafasında. Bende ayrı bir FPS, ayrı bir TPS var. TPS'in doğrudan elini göstermeyi profesyonel bulmuyorum. Daha önce Android için bir FPS sistemi yapmıştım tabii Multiplayer olmadığı için TPS falan yok oyunda. Sırf FPS mesh el sistemi oluşturunca olay çok farklı oluyor, vuruş hissiyatı ve kaliteye bakabilirsin. (Mobil olduğunu lütfen göz önünde bulundur) Video:

Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
 
serhatwxe' Alıntı:
erginegider' Alıntı:
Aslında o bir sonraki aşama değil bir önceki aşama. Sorun burda. Ben de onu anlatmak istiyorum. Eğer maksadın sonuç olarak multiplayer oyun yapmaksa böyle düşünmek zorundasın. Herşeyi sırası ile halletmek zorundasın. SinglePlayer gibi düşünüp Multiplayer e çevirmek, multiplayer oyun geliştirirken yapacağın en kötü hareket olur.
   Ama sen yine de single player da nasıl çözülür onu merak ediyorsan:
   Bu seferde neden iki mesh in aynı anda görünmesini istiyor olabilirsin. İkisini aynı anda görmek istemeyeceğini tahmin ediyorum. Bu durumda o checkbox ayarları (BP de ya da C++ ta farketmez) runtime da yani kodda dinamik olarak değiştirebilirsin. Yani mesela C ye basınca FPS moduna geçmesini istiyorsan örneğin, C ye basınca mesh lerden birini saklayabilir, bunun yanında o checkbox ları istediğin gibi on ya da off hale getirebilir, tekrar C ye basıldığında check box ları tekrar geriye döndürebilirsin. Bu durumda da diğer mesh in görünür olması gerek tabi.
  Eğer herhangi bir sebeple ikisinin de video da bizim gördüğümüz gibi aynı anda görünmesini istiyorsan, FPS mesh'i OnTick fonksiyonunda manuel yani kod ile döndürmen gerekecektir. Yani BP tick fonksiyonunda SetComponentRotation ya da bunun gibi bir fonksiyonla mesh i manuel döndürürsün. 
  Ama tekrar hatırlatmam gerekiyor: Wğer son istediğin bir multiplayer oyun ise bu seçeneklerin hepsi gereksiz. O zaman bir önceki mesajımda ki gibi yapman gerekiyor ki herkes öyle yapıyor zaten. Bu oyunun sadece bu kısmını değil bir sürü başka şeyide etkileyecek. Multiplayer için multiplayer düşünmek zorundasın.


Öncelikle teşekkürler. Hayır amacım bir tuşa basınca FPS moda geçmesi de değil. Basit örnek olsun diye Zula'yı düşünebilirsiniz. Bizi misal ceketli karakter olarak görüyorlar fakat FPS görünümde kıyafetimiz yeşil. Ben benzer sistemi Unreal'da yapmaya kalksam bir Character Blueprint içerisine bir FPS mesh, bir de tam vücut karakter koyarım. FPS Meshi sadece sahip görecek (owner see), tam vücudu ise diğer clientler. Bu sistemi yaptım test ettim gayet iyi çalışıyor. (Videoda anlaşılsın diye tam vücut karakteri ileri taşıdım, hepsini visible yaptım o yüzden garip görüntü var) Fakat en basit AimOffset kısmında bile takılınca dediğiniz doğru olduğunu biliyorum. Sizin dediğiniz gibi yapacağım. Haklısınız her şeyi doğru şekilde yapmak gerekiyor. Fakat pek anlamadım. Bir Blueprint içerisinde 2 mesh mi koyacağım yoksa ayrı ayrı 1 TPS_BP 1 FPS_BP karakter mi olacak? Eğer öyleyse TPS'i C++'a girişmeden ROLE_SimulatedProxy, FPS'i ise ROLE_AutonomousProxy olarak nasıl ayarlayabilirim? Ki bunların aynı noktada başlayıp spawnlanma durumu da var. Tabii eğer sizi doğru anladıysam.

[img=900x450]https://iasbh.tmgrup.com.tr/4ff288/...em-gereksinimleri-tk1-1598865202292.jpg[/img]

   Evet multiplayer için doğru gitmişsin şu ana kadar. Evet tek bir BPn olacak. İçinde iki tane skeletal mesh in olacak. Birisi FPS yani kendin görmen için, diğeri FullBody mesh yani diğerlerinin seni görmesi için. Zula yı pek bilmiyorum ama 100 de 100 oda öyledir. OwnerNoSee olayını da halletmişsin zaten. Buraya kadar yanlış bir şey yok.
   Meseleyi şöyle anlatayım: 4 arkadaşın ile zula oynuyorsun diyelim. Bu 4 bilgisayar bir server a bağlı demektir. Serverda server versiyonu (otorite) oynuyor siz 4 ünüzde ise client versiyonları oynuyor. Aslında bu ortamda spawn olan toplamda 20 karakter var. 4 senin bilg. da 4 ikinci arkadaşında 4 üçüncü arkadaşında 4 son arkadaşında ve bir de server da 4 tane daha var. Server versiyonlar client takilere replication (veri yayını diyelim biz) yapmakla meşgul, client ların kendi aralarında bir bağlantı yok. Tek yapabilecekleri Server a veri göndermek ya da RPC ile orada fonksiyon çağırmak.
    Oyuna ilk girdiğinizde sen yeşil kazağınla bir AK47 tutuyorsun resimdeki gibi.  Senin orada gördüğün character sınıfının FPS meshi. OwnerNoSee ile diğer fullbody meshini kendinden saklamışsın. OnlyOwnerSee ile de FPS ni diğerlerinden saklayabilirsin. Buraya kadar da tamam.
    Sen oyuna ilk girdiğinde spawn olan karakter otomatik olarak ROLE_AutonomousProxy olarak doğdu orada. Çünki o karakterin kontrolü sende. Senin karakterinde server daki otorite karaktere (ROLE_Authority) bağlı ve ordan update alıyor sürekli. Yani sen de bir Proxy (yer tutucu, vekil etc) sin ama AutonomousProxy sin. Yani kullandığın karakterin otoritesi server da olsa da oynarken sende kumanda yetkisine sahipsin. Karşında gördüğün sana bakan diğer 3 arkadaşın ise senin bilgisayarında ROLE_SimulatedProxy ler. Onlar senin bilgiyarında sadece server daki otorite versiyonu simule etmekle meşguller. Serverdaki ne yaparsa onlarda onu yapıyorlar sadece. Peki sistem nasıl işliyor o zaman. AutonomousProxy, server a ben ileri gitmek istiyorum diyor. Bunu bir RPC server fonksiyonla server da ki otorite versiyonuna yaptırıyor. Ve server daki de bunu diğer clientlara "SimulatedProxy" lere replicate ederek onlarında aynı şeyi yapmasını yani simule etmesini sağlıyor. Bütün bunlar otomatik oluyor senin bir şey yapmana gerek yok. Sen rolünü de değiştiremezsin sadece öğrenebilirsin. Senin yapman gereken geliştirici olarak o yaptığın karakterin her 3 role göre değişik şekillerde işlemesini sağlamak. Yani oyun içerisinde bir sürü yerde bu karakter şu an server da oynayan versiyon mu, AutonomousProxy mi, SimulatedProxy mi diye düşünüp ona göre herşeyi koordine etmen gerek. Bunun için kullanacağın IsLocallyControlled, HasAuthority, GetNetworkRole vb. bir sürü fonksiyon var. Onlara bakarsın kendin.
   Yani BP de olsa C++ da olsa oyunu düşünürken neyi nerede nasıl yaptığın önemli. Sen lokalde sağa sola bakıyorsun ama bu bilgi default olarak servera giden bir bilgi değil. Yani control rotation senin local de bilgisayarında olan bir şey. Ne server ın ne de diğer clientların bundan haberi yok. Yapman gereken şey: Eğer autonomous proxy isen (IsLocallyControlled), karakterin ControlRotation Yaw and Pitch ini, ya da tüm rotation ı "server" da bir değişkene atamak (Server RPC fonksiyonu). Tabii ki bu server değişkenin "replicated" olmalı ki diğer SimulatedProxy lere (client) replicate yani yayın edilebilsin. Bu şekilde senin karakterinin bir temsilcisi olan diğer 3 arkadaşının bilgisayarında ki karakterler bu değerleri server vasıtası ile alacaklar. Ve anim graph ta girdi yapıp kendi AimOffset lerini çalıştıracaklar. Böylece herkes görecek ki sen sola sağa bakıyorsun.
 Aynı şeyler TurnInPlace içinde geçerli genel olarak. Mantık aynı yani.
 Biraz uzun oldu ama multiplayer yapıyorsan önce single player yapayım sonra multiplayer a çeviririm demek işleri çok çok zorlaştırır. Arap saçına döner.
 
Büyük ihtimal ile yürüyüş blendspace'nden kaynaklanıyor olabilir. Orayı direction ile besliyorsan directional olarak uyumsuzluk oluşuyor olabilir.
 
erginegider' Alıntı:
serhatwxe' Alıntı:
Öncelikle teşekkürler. Hayır amacım bir tuşa basınc....

   Evet multiplayer için doğru gitmişsin şu ana kadar. Evet tek bir BPn olacak. İçinde iki tane skeletal mesh in olacak. Birisi FPS yani kendin görmen için, diğeri FullBody mesh yani diğerlerinin seni görmesi için...

Hocam çok teşekkürler. Sistemde dediğin her şey en başından berili kuruluydu, sen SimulatedProxy vs. deyince herhalde benim yaptıklarımın dışında bir şeyler var diye düşündüm ama yokmuş, söylediklerin yaptıklarımın arkaplanını açıklıyor. Sistemi en başından beri Multiplayer odaklı kurdum.
Konu dışı olacak ama hakkın yenmez. Boş zamanlarında girip 2dk foruma göz gezdirip yardımcı olman tebrik edilesi.

Bu arada sorunu çözdüm. Sağ sol bakmayı kaldırdım, yukarı aşağı zaten çalışıyor. Get BaseAim Rotation replicated için çalışan bir fonksiyon. TurnInPlace'e gelince ise RunOnServer ile dönüş rotasyonunu içeren TurnAxis'i çalıştırıp Replicated yaptım. Sistem gördüğünüz gibi kusursuz. Pürüzleri kaldırdıktan sonra çok daha iyi olacak.

Video:
Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.


emin2045' Alıntı:
Büyük ihtimal ile yürüyüş blendspace'nden kaynaklanıyor olabilir. Orayı direction ile besliyorsan directional olarak uyumsuzluk oluşuyor olabilir.

Çok teşekkürler Emin. Sorunu yukarıda anlattığım şekilde çözdüm.