leonscottkfm

Unreal MVP
31 May 2015
1,542
5
219
63
28
(34) İstanbul Avrupa
store.steampowered.com
Merhaba arkadaşlar... Çok sık soru soruyorum ama çok sık sorun çıkıyor her seferinde :D
Şimdi arkadaşım oyunu kurdu sunucu başlattı ben de bağlandım. Fakat o spawn olurken ben olamadım ama onu görebiliyordum sanki spectator gibi.
Fakat diğer arkadaşın kurdugunda ona bağlandığımda spawn olabiliyorum. Güvenlik duvarı mı engelliyor antivirüs mü bir şeyleri engelliyor anlamadım.

Sizden isteğim şu :

Travelden sonra karakterler otomatik spawn olsun istemiyorum 5 saniye delaydan sonra hepsini tek seferde spawn edeceğim bunu nasıl yapabilirim ?
 
A oyuncusunun ping i 50,  B oyuncusu 350, A oyuncusu B yi mi bekleyecek? Doğru olan bağlananın spawn olmasıdır, ancak burada dikkat etmen gereken asıl husus, client bağlantı kurdu kendi client içi işlemlerini tamamladı ondan sonra kendi player controller ı üzerinden yine game mode a beni spawnla komutu yolladı, eğer sen her bağlananı doğrudan game mode a spawnlatırsan, client player controller ben nerdeyim diyene kadar possess almaya çalışır dolayısıyla pawn sız bir şekilde 0,0,0 da kendini bulur. yazılımda temel kural işlemler satır satır uygulanır, anlayacağın dikkat etmen gereken tek şey işlem sırası ;)
 
Merhaba, soru sormaktan asla cekinme..

https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/GameFramework/AGameMode/HandleSeamlessTravelPlayer/

virtual void HandleSeamlessTravelPlayer(AController *& C)

diye bir virtual function var GameMode sinifi uzerinde, bu bir virtual function signature isaretlenmis C++ dan kendi gamemode classinda bunun declarationunu olusturup virtual functionu override etmen lazim. Override ettikten sonra pawni secip possess olman lazim buradan gelen C adindaki controller parametresi ile. Bu bir reference to the pointer (AController*&) yani, bir pointerin referansi

void ABenimYarattigimGameMode::HandleSeamlessTravelPlayer(AController *& C)
{
       // PawnSinifi bir UClass olsun, referansini bir yerden aliyorsun. 
    APawn* Pawn = PawnSinifi->GetDefaultObject();
       C->Posess(PawnReferansin);
}

Blueprintte bu fonksiyon event olarak expose edilmis mi su an bilmiyorum ama blueprintten de oluyosa yine fonksiyonlar kismindan da function override edebilirsin.

Burada spawn ettikten sonra server uzerinde PlayerController ile Possess olman gerekli, ki Possess islemi multiplayer oyunlarda sadece Server uzerinde gerceklesiyor, tabii ki replicate edilmesi lazim possess edilecek pawnlarin.

Bak asagiya cok iyi bir tutorial atiyorum aradigina benzer bisiler var. Ama burada tabii SeamlessTravel etkin degil.
https://dev.epicgames.com/community...g-spawning-co-op-partners-in-multiplayer-bp-c
 
"Ben onu görebiliyordum spectator gibi" deyince ben problemin spawn noktasında olduğunu düşündüm. Belki PlayerStart lokasyonunda spawn engellendiği için character spawn olamamış olabilir.
 
Karakterim posses olmuyor destroylanmış sabit bir kameradan görüyor etrafı. Fakat host posses oluyor. 
Teşekkür ederim ama C++ bilgim neredeyse hiç yok denecek kadar az projemi Blueprint üzerinden yönetiyorum ama C++ olarak açmıştım başta.






Şöyle gamemode içerisinde bir delay ile bağlanan oyuncuları server tarafından sıfırlamaya çalıştım . Zaten lobiden buraya bağlanan oyuncular çıkıp tekrar giremez ve lobiden de tekrar oyuncu gelemez. Var olanlar ise sıfırlanacak oyun başladıktan sonra böyle. Bu bir çözüm müdür bilemiyorum.
 
Seamless travel olduktan sonra, yukarida belirttigim method 5 saniye timer olusturup bu bittikten sonra, possess oldugu fonksiyonu nerden cagiriyorsun? Client, Server veya NetMulticast? 

Timer bittiginde tekrardan sunucudan possess etmen lazim yani timer finished olayinda, Event olsturup server diye belirtip, clientten player controller reference gonderip ile possess olman lazim.


[code-sh=cpp]
//Declarations:

FTimerDelegate TimerDelegate;

FTimerHandle TimerHandle;

// Bu fonksiyon 5 saniye sonra timera baglanip, server uzerinde cagrilacak.
UFUNCTION(Server, Reliable)
void PossessAfterFiveSec_Server(AController*& Controller);


// Virtual function bu sekilde override ediliyor C++ dilinde...
virtual void HandleSeamlessTravelPlayer(AController *& C) override;

//Definitions:

void ABenimYarattigimGameMode::HandleSeamlessTravelPlayer(AController *& C)
{
         // Burada timer olusturuyorsuz, ve parametre olarak gelen controlleri geciriyoruz
         TimerDelegate.BindUFunction(this, FName("PossessAfterFiveSec_Server"), C);
         GetWorld()->GetTimerManager().SetTimer(TimerHandle, TimerDelegate, 5.0f, false);
          
          // Burada da base class constructoru cagiriyoruz.
          Super::HandleSeamlessTravelPlayer(C);
}

// 5 saniye sonra serverda cagirilacak fonksiyon
void ABenimYarattigimGameMode::possessAfterFiveSec_Server_Implementation(AController *&)
{
       // PawnSinifini referansini bir yerden aliyorsun, spawn edilmis olmali tabii ki. 
       APawn* Pawn = PawnReferansiAl()...
       C->Possess(pawn);
}

[/code-sh]

Sen galiba timer bittigindeki eventi yine clientten cagirdigin icin ve listen server zaten ayni zamanda client-server oldugu icin authority acisindan sadece Server oldugu icin Possess client uzerinde calismiyor. Output Loga bakabilirsin, warning vermesi lazim eger possess fonksiyonu gecerli olmuyorsa veya yaptigin remote prodecure call mesela eger Authority olarak sahip degilse aktore vesaire..