Photon Engine 2 ilk defa kullanıyorum. Denemek amaçlı çok aşırı basit 2d bir oyun yaptım ve test ettim. 2 karakterin animasyonları senkronize değil. Örneğin 2. oyuncu ile kılıç sallatıyorum fakat aynı anda sallamıyor. 1. oyuncunun ekranında 1 saniye sonra sallıyor. Böylece bazen damage vuruyorken bazen vurmuyor. Ayrıca karakterlerin transformu da senkronize değil. 2. oyuncunun ekranında 2. oyuncunun transform position x'i -3'ken birinci oyuncunun ekranında 2. oyuncunun transform position x'i 2.5f civarında gösteriyor. Hem animasyonlar hem de pozisyonlar senkronize değil. Oyun da akıcı değil. Sanki böyle biraz laglı. En popüler multiplayer aracı bu sanırım. Siz nasıl bunu kullanıyorsunuz? Bilmediğim bir ince ayarı mı var acaba? |
Photon Engine 2 Senkronizasyon ve Lag Sorunu
-
-
Bilmeyenler için konuyu güncelleyeyim. Photon Engine PUN2 çok ilkel bir multiplayer eklentisi. Yani fizik tabanlı olmayan oyunlarınız için kullanabilirsiniz. Performansı rezalet durumda. Oyununuzda fizik varsa Photon Fusion kullanmak daha iyi. Eğer WebGL oyunu yapıyorsanız ve oyununuzda fizik varsa maalesef ikisi de işinizi görmez. Daha karmaşık olan Photon Quantum'u kullanmanız gerekiyor.
-
Zamanla ve gayretle kazandığınız bilgi birikimini paylaştığınız için teşekkürler
-
Güzel yorumunuz için teşekkürler. Foruma çok sık giremediğim için geç oldu ama :)
-
Alıntı
metni:Merhaba Bende Suan Unityde Photon Quantum kullnarak bir 2d oyun yapiyorum fizik agirlikli burdapaylastigin gordum ve tecrubelerine dayanarak bir kac soru sormak istoyirum oncelikle quantumda hali hazirda bir egitim varmidir veya siz bu surecte nasil ilerlediniz Ogrenebilirmiyim Simdiden cok tesekkur ederim @mpal15 özel mesaj atamıyorum. Buradan cevaplayayım. Quantum tamamen karmaşık bir sistem. Unity ile bir benzerliği yok. Sıfırdan öğrenmek için yeterli kaynak da yok. Tolga KARANLIKOĞLU'nun birkaç videosu bulunmakta:
https://www.youtube.com/@tolgakaranlik
Fiziğin çok önemli olduğu bir dövüş oyunu yapmıştım. Mobil ve PC'de Fusion ile sorunsuz çalışıyordu fakat WebGL'de inanılmaz laga sahipti. Eğer oyunun WebGL için değilse Quantum'u boşverip direkt olarak Fusion kullanabilirsin. Öğrenmesi gayet kolay. Fakat bir Web3 oyunu geliştiriyorsan ve WebGL şart ise, oyununda da fizik çok ön plandaysa tek çözüm Quantum veya Fusion'da WebGL'deki lagı by-pass etmek. Kendi deneyip bulduğum yöntemle karakterlerdeki lagı şöyle byPass ettim:
Host oyuncuda kesinlikle lag olmuyorken clientte inanılmaz bir lag oluyor. Ben de bunu çözmek için client'in Fusion ile değil de lokalde kendi Update methoduyla hareket etmesini fakat 0.25 saniyede bir Fusion üzerinden host'un ekranından ağdaki gerçek konumunu kontrol etmesini sağladım. Ayrıca client'in üzerinde ekli olan networkRigidbody2D ve networkTransform gibi componentleri kaldırdım. Host'un yönettiği karakterde ise bunlar kullanılıyorsa eğer kaldırılmaması gerek. Mantığı anladıysan gerisi kolay. Bu yöntemle Quantum'daki kadar akıcılık elde ettim.
public float coolDownTime = 0.25f; private float coolDownTimer = 0.25f; public override void FixedUpdateNetwork() { if (!GetInput(out NetworkInputData data)) return; if (Object.HasInputAuthority && !Object.HasStateAuthority) { //Client ve karakterini kontrol ettiğin objeysen 0.25 saniyede bir Pozisyonunu yolla. if(coolDownTimer > 0) { coolDownTimer -= Runner.DeltaTime; } else { RPC_Position(this.transform.position, this.transform.localScale.x); coolDownTimer = coolDownTime; } } } [Rpc(RpcSources.InputAuthority, RpcTargets.All)] public void RPC_Position(Vector3 playerPos, float scaleX, RpcInfo info = default) { //X eksenindeki hata payı 0.5'ten fazlaysa pozisyonlarını eşitliyor if (Mathf.Abs(playerPos.x - this.transform.position.x) > 0.5f) { this.transform.position = new Vector3(playerPos.x, this.transform.position.y, playerPos.z); } //Y eksenindeki hata payı 0.5'ten fazlaysa pozisyonlarını eşitliyor if (Mathf.Abs(playerPos.y - this.transform.position.y) > 0.5f) { this.transform.position = new Vector3(this.transform.position.x, playerPos.y, playerPos.z); } //Obje scale hata payı yanlışsa (karakter sola bakıyorken gerçekte sağa bakıyorsa mesela) düzeltir if (this.transform.localScale.x != scaleX) { this.transform.localScale = new Vector3(scaleX, this.transform.localScale.y, this.transform.localScale.z); } }Kod
Yığını:
-
Cok teşekkür ederim geri donusunuz icin, oyunum webgl de olacağı icin quantumu tercih ettim
Suan quantumda baya bir yol aldim cogu seyi bittirdim sayilir geri donusunuz icin tekrar teşekkür ederim
< Bu ileti Android uygulamasından atıldı >
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X