gamemaxs

Yeni üye
15 Kas 2024
25
4
3
Merhabalar, GameMode'dan OnPostLogin ile bütün PlayerController'ları bir array'e ekliyorum. Ancak bu array'i döndürüp widgetlara işlem yaptığımda çalışmıyor. GameState'deki PlayerArray ile yapmamı söylüyorlar, Gamestatedeki PlayarArrayde Playerstatelerden widgetlara erisemiyorum.
 

Ekli dosyalar

  • Screenshot_1.png
    Screenshot_1.png
    37.3 KB · Görüntüleme: 10
  • Screenshot_2.png
    Screenshot_2.png
    67.5 KB · Görüntüleme: 10
Son düzenleme:
Merhabalar, GameMode'dan OnPostLogin ile bütün PlayerController'ları bir array'e ekliyorum. Ancak bu array'i döndürüp işlem yaptığımda çalışmıyor. GameState'deki PlayerArray ile yapmamı söylüyorlar, Gamestatedeki PlayarArrayde Playerstatelere ise clienta erisemiyorum.
Buradan bir değer çekmeden önce şunu yapmalısın.
Mesela Custom bir playercontroller oluştur kendine önce. Sonra bunu oyunun mod kısmına ekle.

Mesela Parkur_PC ve bunu mod seçerken hani playerstate vs girilen yer var ya oradan seç bunu.

Sonra bu Parkur_PC yi nasıl çağırırsın onu söyleyeyim. Unrealde garip olaylar var. Mesela normalde CustomPlayerStateye erişmek istersen. Cast edersen ve object kısmına get player state yazarsan sadece 0 indexli oyuncuyu alır. Bunun olmaması için normal PlayerStateyi çağırıp onu kendi Custom PlayerStatene Cast etmen gerekir.

Örnek verecek olursak şöyle.

1733766232615.png

Şimdi PlayerState yazan node var ya, işte o Unrealin Default PlayerState değeri. Diğeri ise bizim oluşturduğumuz. Eğer bunu Defaulttan çekmezsen oraya GetPlayerState koyarsan Indexi 0 olan oyuncuyu dikkate alır. Fakat biz hepsine özel olarak işlem uygulamak istiyoruz. Bu yüzden normal PlayerStateyi alıp kendi Custom Player Statene Convert edip Castlemen lazım.

PlayerController de böyle. Eğer GetPlayerController yaparsan Indexi 0 olanı çekecek.
Ama PlayerControllerin böyle bir özelliği yok. Fakat PlayerStateyi böyle çağırıp

1733766331154.png

Böyle yaparsan o zaman her oyuncunun kendi PlayerState -> (bizim customplayerstate ile) bilgisinden PlayerController çekmiş olacaksın. İşlemi bu şekilde yaptığında bir sorun kalmadığını göreceksin.
Bu arada oyuncularla ilgili bir işlem yaptığında GameMode sadece sunucu tarafında çalışacağı için, tüm oyuncuları sunucu oyuncusuna göre şekillendiriyor. Mesela ben her oyuncuya özel bir işlem yapamıyorum burada. Her oyuncuyu kendi mezarına ışınlamak için bir kod yazmıştım fakat sunucu hangi mezarı kayıt ettiyse hepsi ona ışınlanıyordu.

İşlemleri PlayerController veya PlayerState üzerinden yapmaya çalış.

Son olarak Her katılan oyuncunun PlayerState değerine müdahale edebilirsin. Ve PlayerControllerle ilgilenmene gerek kalmaz. Şöyle:



1733766564242.png

MaxPlayers Arrayına New Playersten gelen oyuncuları ekledim ve onları Grave_PS yani Grave_PlayerState Custom PlayerState değerimi onların içerisinden çağırdım. Ama önce fark ettiysen Default PlayerState değerini çekip onu convertledim. Böylelikle her katılan PlayerControlleri biri diziye almış ve hepsinin playerstate değerlerini CustomPlayerStateme convertleyip işlem gerçekleştirebiliyorum.
Bu işlemle daha az önce uğraştım beni de uğraştırdı biraz. Forumdan bir arkadaşın isteği üzerine, her oyuncunun öldüğünde kendi mezarına ışınlanacağı bir sistem yaptım. Her oyuncuya bir ID numarası verdim ve her mezara bir ID numarası verdim eğer oyuncu öldüyse ve numarası eşleşiyorsa ilgili mezara gidiyor. Video aşağıda.

 
Son düzenleme:
Buradan bir değer çekmeden önce şunu yapmalısın.
Mesela Custom bir playercontroller oluştur kendine önce. Sonra bunu oyunun mod kısmına ekle.

Mesela Parkur_PC ve bunu mod seçerken hani playerstate vs girilen yer var ya oradan seç bunu.

Sonra bu Parkur_PC yi nasıl çağırırsın onu söyleyeyim. Unrealde garip olaylar var. Mesela normalde CustomPlayerStateye erişmek istersen. Cast edersen ve object kısmına get player state yazarsan sadece 0 indexli oyuncuyu alır. Bunun olmaması için normal PlayerStateyi çağırıp onu kendi Custom PlayerStatene Cast etmen gerekir.

Örnek verecek olursak şöyle.

Ekli dosyayı görüntüle 501

Şimdi PlayerState yazan node var ya, işte o Unrealin Default PlayerState değeri. Diğeri ise bizim oluşturduğumuz. Eğer bunu Defaulttan çekmezsen oraya GetPlayerState koyarsan Indexi 0 olan oyuncuyu dikkate alır. Fakat biz hepsine özel olarak işlem uygulamak istiyoruz. Bu yüzden normal PlayerStateyi alıp kendi Custom Player Statene Convert edip Castlemen lazım.

PlayerController de böyle. Eğer GetPlayerController yaparsan Indexi 0 olanı çekecek.
Ama PlayerControllerin böyle bir özelliği yok. Fakat PlayerStateyi böyle çağırıp

Ekli dosyayı görüntüle 502

Böyle yaparsan o zaman her oyuncunun kendi PlayerState -> (bizim customplayerstate ile) bilgisinden PlayerController çekmiş olacaksın. İşlemi bu şekilde yaptığında bir sorun kalmadığını göreceksin.
Bu arada oyuncularla ilgili bir işlem yaptığında GameMode sadece sunucu tarafında çalışacağı için, tüm oyuncuları sunucu oyuncusuna göre şekillendiriyor. Mesela ben her oyuncuya özel bir işlem yapamıyorum burada. Her oyuncuyu kendi mezarına ışınlamak için bir kod yazmıştım fakat sunucu hangi mezarı kayıt ettiyse hepsi ona ışınlanıyordu.

İşlemleri PlayerController veya PlayerState üzerinden yapmaya çalış.

Son olarak Her katılan oyuncunun PlayerState değerine müdahale edebilirsin. Ve PlayerControllerle ilgilenmene gerek kalmaz. Şöyle:



Ekli dosyayı görüntüle 503

MaxPlayers Arrayına New Playersten gelen oyuncuları ekledim ve onları Grave_PS yani Grave_PlayerState Custom PlayerState değerimi onların içerisinden çağırdım. Ama önce fark ettiysen Default PlayerState değerini çekip onu convertledim. Böylelikle her katılan PlayerControlleri biri diziye almış ve hepsinin playerstate değerlerini CustomPlayerStateme convertleyip işlem gerçekleştirebiliyorum.
Bu işlemle daha az önce uğraştım beni de uğraştırdı biraz. Forumdan bir arkadaşın isteği üzerine, her oyuncunun öldüğünde kendi mezarına ışınlanacağı bir sistem yaptım. Her oyuncuya bir ID numarası verdim ve her mezara bir ID numarası verdim eğer oyuncu öldüyse ve numarası eşleşiyorsa ilgili mezara gidiyor. Video aşağıda.

Tesekkurler hocam bilgilendirme icin. Anladim nasil yaptiginizi ama widgetlara bir turlu ulasamiyorum. Widgetlar sadece local de oldugu icin sanirim replice edilmiyor.
 
Tesekkurler hocam bilgilendirme icin. Anladim nasil yaptiginizi ama widgetlara bir turlu ulasamiyorum. Widgetlar sadece local de oldugu icin sanirim replice edilmiyor.
Yapmak istediğin şeyi söyle yapayım. Tam olarak ne yapmak istiyorsun sen ?
İlgili oyuncunun Widgetine erişip değer mi değiştirmek istiyorsun ?
Widget Replicate edilmez. Değerler replicate edilir ve Widget üzerinden gösterilir.
 
Yapmak istediğin şeyi söyle yapayım. Tam olarak ne yapmak istiyorsun sen ?
İlgili oyuncunun Widgetine erişip değer mi değiştirmek istiyorsun ?
Widget Replicate edilmez. Değerler replicate edilir ve Widget üzerinden gösterilir.
Widget icindeki degerleri degistirmek istiyordum, spesifik bir playerin. Ornegin 3 kisilik oyunda birinin widgetindeki degerleri degistirmek.
 
Widget icindeki degerleri degistirmek istiyordum, spesifik bir playerin. Ornegin 3 kisilik oyunda birinin widgetindeki degerleri degistirmek.
Doğrudan o oyuncunun değerini değiştireceksin. Widget sadece o değeri çekecek. Başka bir şey yapmaz Widget.
Yani oyuncunun içerisindeki değeri değiştirmen lazım.

Senin için bir sistem tasarladım. Admin olan oyuncu Z tuşuna basınca ID numarası 1 yani indexi 1 olan oyuncunun adını değiştiriyor ve bu Widgetta güncelleniyor.

Video burada :



İstediğin şey böyle bir şey mi ?
Daha iyisi yapılabilir sadece adminin açabileceği bir menü yapabilirsin. Bu menüde işlemler olur ve ID yazma kutucuğu olur. Kutucuktan gelen değere göre hangi ID yadıysan o ID üzerinde işlem gerçekleştirilir. Böylece o spesifik dediğin ID oyun içinde bir değişken olur. Sadece 1 numaralı oyuncuyu değil 3 veya 4 numaralı oyuncuyu da işleme tabii tutabilirsin. Mesela sunucudan atmak veya adını değiştirmek gibi. Ya da yanına ışınlamak gibi.
 
Son düzenleme:
  • Beğen
Tepkiler: gamemaxs
Doğrudan o oyuncunun değerini değiştireceksin. Widget sadece o değeri çekecek. Başka bir şey yapmaz Widget.
Yani oyuncunun içerisindeki değeri değiştirmen lazım.

Senin için bir sistem tasarladım. Admin olan oyuncu Z tuşuna basınca ID numarası 1 yani indexi 1 olan oyuncunun adını değiştiriyor ve bu Widgetta güncelleniyor.

Video burada :



İstediğin şey böyle bir şey mi ?
Daha iyisi yapılabilir sadece adminin açabileceği bir menü yapabilirsin. Bu menüde işlemler olur ve ID yazma kutucuğu olur. Kutucuktan gelen değere göre hangi ID yadıysan o ID üzerinde işlem gerçekleştirilir. Böylece o spesifik dediğin ID oyun içinde bir değişken olur. Sadece 1 numaralı oyuncuyu değil 3 veya 4 numaralı oyuncuyu da işleme tabii tutabilirsin. Mesela sunucudan atmak veya adını değiştirmek gibi. Ya da yanına ışınlamak gibi.
Tesekkurler hocam, Admin icin degilde oyuncularin kendisi arasindaki ilesitim icin. Anladigim kadariyla siz bir stringi ornegin pc de bind ettiniz onu degistiriyorsunuz. Benim yapmak istedigim ornegin 4 kisi monopoly oynamasi gibi. Siz tas oynadiginiz sira bana gecti. Bunu yapmanin tek yolunun rpc oldugunu dusunuyorum. Ornegin siradaki playerin widgetini guncelleyip sirayi ona verirken rpc ile playername ini gonderip eger es ise widgeti ona gore tekrar degistir.
 
Buradan bir değer çekmeden önce şunu yapmalısın.
Mesela Custom bir playercontroller oluştur kendine önce. Sonra bunu oyunun mod kısmına ekle.

Mesela Parkur_PC ve bunu mod seçerken hani playerstate vs girilen yer var ya oradan seç bunu.

Sonra bu Parkur_PC yi nasıl çağırırsın onu söyleyeyim. Unrealde garip olaylar var. Mesela normalde CustomPlayerStateye erişmek istersen. Cast edersen ve object kısmına get player state yazarsan sadece 0 indexli oyuncuyu alır. Bunun olmaması için normal PlayerStateyi çağırıp onu kendi Custom PlayerStatene Cast etmen gerekir.

Örnek verecek olursak şöyle.

Ekli dosyayı görüntüle 501

Şimdi PlayerState yazan node var ya, işte o Unrealin Default PlayerState değeri. Diğeri ise bizim oluşturduğumuz. Eğer bunu Defaulttan çekmezsen oraya GetPlayerState koyarsan Indexi 0 olan oyuncuyu dikkate alır. Fakat biz hepsine özel olarak işlem uygulamak istiyoruz. Bu yüzden normal PlayerStateyi alıp kendi Custom Player Statene Convert edip Castlemen lazım.

PlayerController de böyle. Eğer GetPlayerController yaparsan Indexi 0 olanı çekecek.
Ama PlayerControllerin böyle bir özelliği yok. Fakat PlayerStateyi böyle çağırıp

Ekli dosyayı görüntüle 502

Böyle yaparsan o zaman her oyuncunun kendi PlayerState -> (bizim customplayerstate ile) bilgisinden PlayerController çekmiş olacaksın. İşlemi bu şekilde yaptığında bir sorun kalmadığını göreceksin.
Bu arada oyuncularla ilgili bir işlem yaptığında GameMode sadece sunucu tarafında çalışacağı için, tüm oyuncuları sunucu oyuncusuna göre şekillendiriyor. Mesela ben her oyuncuya özel bir işlem yapamıyorum burada. Her oyuncuyu kendi mezarına ışınlamak için bir kod yazmıştım fakat sunucu hangi mezarı kayıt ettiyse hepsi ona ışınlanıyordu.

İşlemleri PlayerController veya PlayerState üzerinden yapmaya çalış.

Son olarak Her katılan oyuncunun PlayerState değerine müdahale edebilirsin. Ve PlayerControllerle ilgilenmene gerek kalmaz. Şöyle:



Ekli dosyayı görüntüle 503

MaxPlayers Arrayına New Playersten gelen oyuncuları ekledim ve onları Grave_PS yani Grave_PlayerState Custom PlayerState değerimi onların içerisinden çağırdım. Ama önce fark ettiysen Default PlayerState değerini çekip onu convertledim. Böylelikle her katılan PlayerControlleri biri diziye almış ve hepsinin playerstate değerlerini CustomPlayerStateme convertleyip işlem gerçekleştirebiliyorum.
Bu işlemle daha az önce uğraştım beni de uğraştırdı biraz. Forumdan bir arkadaşın isteği üzerine, her oyuncunun öldüğünde kendi mezarına ışınlanacağı bir sistem yaptım. Her oyuncuya bir ID numarası verdim ve her mezara bir ID numarası verdim eğer oyuncu öldüyse ve numarası eşleşiyorsa ilgili mezara gidiyor. Video aşağıda.

Max Playersı neden replicate ettiniz onu anlayamadım.
 
Tesekkurler hocam, Admin icin degilde oyuncularin kendisi arasindaki ilesitim icin. Anladigim kadariyla siz bir stringi ornegin pc de bind ettiniz onu degistiriyorsunuz. Benim yapmak istedigim ornegin 4 kisi monopoly oynamasi gibi. Siz tas oynadiginiz sira bana gecti. Bunu yapmanin tek yolunun rpc oldugunu dusunuyorum. Ornegin siradaki playerin widgetini guncelleyip sirayi ona verirken rpc ile playername ini gonderip eger es ise widgeti ona gore tekrar degistir.
dediğiniz şey turn based oluyor hocam.

bu video serisi nasıl bir mantık kuracağınıza dair yol gösterebilir :
Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
 
Tesekkurler hocam, Admin icin degilde oyuncularin kendisi arasindaki ilesitim icin. Anladigim kadariyla siz bir stringi ornegin pc de bind ettiniz onu degistiriyorsunuz. Benim yapmak istedigim ornegin 4 kisi monopoly oynamasi gibi. Siz tas oynadiginiz sira bana gecti. Bunu yapmanin tek yolunun rpc oldugunu dusunuyorum. Ornegin siradaki playerin widgetini guncelleyip sirayi ona verirken rpc ile playername ini gonderip eger es ise widgeti ona gore tekrar degistir.
Zor.... Bilmiyorum kumar oyunları falan o tarz şeyler gibi bir şey lazım.
Üst derece UI bilgisi lazım bunun için herhalde. Başka yöntemlerle de yapılabiliyordur. Benim bildiğim bunlar UI değil. 2D Meshler.
 
Merhabalar, GameMode'dan OnPostLogin ile bütün PlayerController'ları bir array'e ekliyorum. Ancak bu array'i döndürüp widgetlara işlem yaptığımda çalışmıyor. GameState'deki PlayerArray ile yapmamı söylüyorlar, Gamestatedeki PlayarArrayde Playerstatelerden widgetlara erisemiyorum.
Networking olayını çok iyi anlaman gerekiyor. Gamemode sadece server da var. Widgetlar ise sadece client ta var. PlayerController lar hem serverda var hem client ta var. PlayerControllerı iki ayrı yerde bulunan iki ikiz kardeş diye hayal edebilirsin. Bunların göbekleri bir birlerine uzun bir kordonla bağlı, ama sadece "data" (yani değişkenler) bu kordondan iki ikiz arasında iletilebiliyor (replication). Ancak bu iletim sadece tek yönlü. Server daki PlayerController client taki ikiz playercontroller ına istediği değişkeni kurulan kordon kanalı sayesinde aktarabilir. Ama tersi olamaz. Yani client server a data gönderemez. RPC yapabilir ama. Neyse networking tarafı burası için çok uzun sürer.
1. Öncelikle böyle bir PlayerController lar listesi arrayı yapmana gerek yok. Çünkü bu çok sık istenecek bir şey olduğu için epic games senin için bunu yapmış. Yaparsan işleri karıştırırsın. Bunun için yol GameMode içerisinden PlayerArray var. Bu PlayerArray bir playerstate listesi tutuyor zaten. Diyeceksin ki ben playerstate istemiyorum playercontroller istiyorum. Her playerstate in sahibi yani "Owner" ı PlayerController olduğu için bir for each döngüsü içerisinde hepsinin tek tek GetOwner ile PlayerController larına ulaşacaksın. Eğer PlayerController içerisinde ki kendi oluşturduğun bir değişkene ulaşmak istiyorsan kendi özel PlayerController class ına "cast" etmen gerektiğini de unutma.
2. Yukarıdaki sistem çok kolay ve direk çalışır ancak bir şeye dikkat: Sen "sadece" server da bulunan gamemode a ulaştın, oradan "sadece" server da bulunan gamestate e eriştin, ve oradan da serverda bulunan playerstate lerin listesine yani playerarray a eriştin. Bu playerstateler, gamemode ve gamestate ten farklı olarak aynı zamanda client ta da bulunuyorlar ancak sen şu an serverdaki listeye ulaştın. Bu serverdaki listedeki her playerstate in bir ikizide client tarafında yani oyuncunun bilgisayarında da var ve göbekten bağlılar. Data alışverişi, senin elinde listesi olan playerstate lerden, client taki ikizlerine doğru sürekli oluyor. Tabii senin seçtiğin değişkenler sadece, hepsi değil. Bu playerstate için söylediğim her şey playercontroller için de aynen geçerli. Bu yöntemle playercontoller lara da ulaşırsın, çünkü her playerstate in owner ı kendi playercontrollerı. Ama dikkat et bu player controller lar serverda; halen client takilere ulaşmadın. Ne yazık ki sen bir widget a ulaşmaya çalışıyorsun. Bu widgetlara ulaşabilirsin ama sadece "server" daki playercontrollerdaki widgetlara. (Bu arada oradan değer değiştirmen için yine cast etmen gerek. Base class ta senin oluşturduğun bir değişkeni değiştiremezsin.)
3. Peki bu mantıkla biz widget ı serverdaki playercontroller dan client taki playercontroller a replication sistemi ile gönderebilir miyiz? Hayır. "Replication" data göndermek içindir tüm objeleri göndermek için değildir. Mantığı değiştirmelisin. Bir float replicate edebilirsin, bir string replicate edebilirsin bir int replicate edebilirsin, ancak bir widget replicate edilmez. Başka bir deyişle eğer karakterin health değeri bir widget ta saklı ise, sen o health değerini replicate edersin. Tüm widget ı replicate etmezsin. Bu çok gereksiz ve çok fazla. Tüm akışı tıkar.
Peki widget ta ki health değerini replicate etmek istiyorsun diyelim ki. Bunu yapabilir misin? Hayır bunu da başka bir sorun nedeni ile yapamazsın. Bunu sebebi: Server daki her PlayerController ın bir ikizi de client ta bulunuyor, ve arada direk bir iletişim var, göbek bağları sayesinde. Ama aynı şey widget lar için söz konusu değil. Başka bazı "actor" lerde de aynen PlayerController da olan iletişimi kurabilirsin (Owner replication sistemi) ve bazı diğer şeyler de aynı replication sistemi zaten kurulmuş durumda (mesela character veya playerstate gibi). Ama widget bu durumlardan biri değil. Actor değil ki kendin sistem kurasın. Character ya da playerstate gibi kendi kurulu sistemi de yok.
4. Şöyle bir soru akla gelebilir. Epic games neden GameMode->GameState->PlayerArray ulaşım yolunu dizayn ederken, PlayerArray ı neden playerstate tipinde yapmış ta playercontroller tipinde yapmamış. Bizi orada getowner ile playercontroller a sonradan ulaşmaya zorluyor. Kulağı ters elle tutmaya benziyor gibi duruyor. Sonuçta bir çok insan playerstate e değil de playercontroller a ihtiyaç duyar gibi sanki.
Bunun cevabı çok basit. Çünki normalde senin UI da göstermek isteyebileceğin herşey aslında widget ta durmaya uygun değil. Widget bir datayı göstermek içindir, veri tutmak için değildir. Bunu üstüne PlayerController da veri tutmak maksadı taşımamaktadır normalde. PlayerController ın görevi daha çok kullanıcı arayüzü widgetlar tuşlar vb. oyuncuyu direk ilgilendiren konulardır. O zaman bu tarz data yı yani UI da göstermemiş gereken data yı tutmak için bir şey dizayn etmemişler mi?
Sürpriz sürpriz: Aslında "PlayerState" bu tarz verileri tutmak için yapılmıştır. Yani health, mana vb. bir değerin varsa, PlayerState, (dizayn olarak) bunları tutmak için yaratılmıştır. O yüzden aynen playercontroller gibi hem server da hem de client ta bulunur, ve tam otomatik replicate özelliği açıktır. Sadece değişkeni seçersin ve replication yani iletişim başlar. Hem server dan hem client tan, çok kolay bir şekilde ulaşılabilir. Neredeyse bütün diğer sınıflardan en kolay şekilde ulaşılabilen sınıftır.
Uzun oldu ve soruya cevap olmaya bilir ancak maksat neyin nasıl olduğunu göstermek. Çözüm yolu senin olacak. Sanırım anlattıklarımdan neler yapman gerektiğini kendin çıkarabilirsin.
 
Son düzenleme:
  • Beğen
Tepkiler: emin2045
Networking olayını çok iyi anlaman gerekiyor. Gamemode sadece server da var. Widgetlar ise sadece client ta var. PlayerController lar hem serverda var hem client ta var. PlayerControllerı iki ayrı yerde bulunan iki ikiz kardeş diye hayal edebilirsin. Bunların göbekleri bir birlerine uzun bir kordonla bağlı, ama sadece "data" (yani değişkenler) bu kordondan iki ikiz arasında iletilebiliyor (replication). Ancak bu iletim sadece tek yönlü. Server daki PlayerController client taki ikiz playercontroller ına istediği değişkeni kurulan kordon kanalı sayesinde aktarabilir. Ama tersi olamaz. Yani client server a data gönderemez. RPC yapabilir ama. Neyse networking tarafı burası için çok uzun sürer.
1. Öncelikle böyle bir PlayerController lar listesi arrayı yapmana gerek yok. Çünkü bu çok sık istenecek bir şey olduğu için epic games senin için bunu yapmış. Yaparsan işleri karıştırırsın. Bunun için yol GameMode içerisinden PlayerArray var. Bu PlayerArray bir playerstate listesi tutuyor zaten. Diyeceksin ki ben playerstate istemiyorum playercontroller istiyorum. Her playerstate in sahibi yani "Owner" ı PlayerController olduğu için bir for each döngüsü içerisinde hepsinin tek tek GetOwner ile PlayerController larına ulaşacaksın. Eğer PlayerController içerisinde ki kendi oluşturduğun bir değişkene ulaşmak istiyorsan kendi özel PlayerController class ına "cast" etmen gerektiğini de unutma.
2. Yukarıdaki sistem çok kolay ve direk çalışır ancak bir şeye dikkat: Sen "sadece" server da bulunan gamemode a ulaştın, oradan "sadece" server da bulunan gamestate e eriştin, ve oradan da serverda bulunan playerstate lerin listesine yani playerarray a eriştin. Bu playerstateler, gamemode ve gamestate ten farklı olarak aynı zamanda client ta da bulunuyorlar ancak sen şu an serverdaki listeye ulaştın. Bu serverdaki listedeki her playerstate in bir ikizide client tarafında yani oyuncunun bilgisayarında da var ve göbekten bağlılar. Data alışverişi, senin elinde listesi olan playerstate lerden, client taki ikizlerine doğru sürekli oluyor. Tabii senin seçtiğin değişkenler sadece, hepsi değil. Bu playerstate için söylediğim her şey playercontroller için de aynen geçerli. Bu yöntemle playercontoller lara da ulaşırsın, çünkü her playerstate in owner ı kendi playercontrollerı. Ama dikkat et bu player controller lar serverda; halen client takilere ulaşmadın. Ne yazık ki sen bir widget a ulaşmaya çalışıyorsun. Bu widgetlara ulaşabilirsin ama sadece "server" daki playercontrollerdaki widgetlara. (Bu arada oradan değer değiştirmen için yine cast etmen gerek. Base class ta senin oluşturduğun bir değişkeni değiştiremezsin.)
3. Peki bu mantıkla biz widget ı serverdaki playercontroller dan client taki playercontroller a replication sistemi ile gönderebilir miyiz? Hayır. "Replication" data göndermek içindir tüm objeleri göndermek için değildir. Mantığı değiştirmelisin. Bir float replicate edebilirsin, bir string replicate edebilirsin bir int replicate edebilirsin, ancak bir widget replicate edilmez. Başka bir deyişle eğer karakterin health değeri bir widget ta saklı ise, sen o health değerini replicate edersin. Tüm widget ı replicate etmezsin. Bu çok gereksiz ve çok fazla. Tüm akışı tıkar.
Peki widget ta ki health değerini replicate etmek istiyorsun diyelim ki. Bunu yapabilir misin? Hayır bunu da başka bir sorun nedeni ile yapamazsın. Bunu sebebi: Server daki her PlayerController ın bir ikizi de client ta bulunuyor, ve arada direk bir iletişim var, göbek bağları sayesinde. Ama aynı şey widget lar için söz konusu değil. Başka bazı "actor" lerde de aynen PlayerController da olan iletişimi kurabilirsin (Owner replication sistemi) ve bazı diğer şeyler de aynı replication sistemi zaten kurulmuş durumda (mesela character veya playerstate gibi). Ama widget bu durumlardan biri değil. Actor değil ki kendin sistem kurasın. Character ya da playerstate gibi kendi kurulu sistemi de yok.
4. Şöyle bir soru akla gelebilir. Epic games neden GameMode->GameState->PlayerArray ulaşım yolunu dizayn ederken, PlayerArray ı neden playerstate tipinde yapmış ta playercontroller tipinde yapmamış. Bizi orada getowner ile playercontroller a sonradan ulaşmaya zorluyor. Kulağı ters elle tutmaya benziyor gibi duruyor. Sonuçta bir çok insan playerstate e değil de playercontroller a ihtiyaç duyar gibi sanki.
Bunun cevabı çok basit. Çünki normalde senin UI da göstermek isteyebileceğin herşey aslında widget ta durmaya uygun değil. Widget bir datayı göstermek içindir, veri tutmak için değildir. Bunu üstüne PlayerController da veri tutmak maksadı taşımamaktadır normalde. PlayerController ın görevi daha çok kullanıcı arayüzü widgetlar tuşlar vb. oyuncuyu direk ilgilendiren konulardır. O zaman bu tarz data yı yani UI da göstermemiş gereken data yı tutmak için bir şey dizayn etmemişler mi?
Sürpriz sürpriz: Aslında "PlayerState" bu tarz verileri tutmak için yapılmıştır. Yani health, mana vb. bir değerin varsa, PlayerState, (dizayn olarak) bunları tutmak için yaratılmıştır. O yüzden aynen playercontroller gibi hem server da hem de client ta bulunur, ve tam otomatik replicate özelliği açıktır. Sadece değişkeni seçersin ve replication yani iletişim başlar. Hem server dan hem client tan, çok kolay bir şekilde ulaşılabilir. Neredeyse bütün diğer sınıflardan en kolay şekilde ulaşılabilen sınıftır.
Uzun oldu ve soruya cevap olmaya bilir ancak maksat neyin nasıl olduğunu göstermek. Çözüm yolu senin olacak. Sanırım anlattıklarımdan neler yapman gerektiğini kendin çıkarabilirsin.
Hocam cok tesekkur ederim boyle bir detayli aciklama icin. Ornegin butun playerlarin widgetini silmek istedigimde widgetler replication olmadigi icin cozemiyordum. Sizden aldigim yontem ile nasil yapacagimi buldum. Ornegin son secimi client 2 yapti ve sonra butun widgetler silinecek. Butona basinca pc deki serverda calisan custom eventi tetikliyorum. Bu da game mode a erisip oradan playerArray ile pc deki multicast olan bi custom eventi tetikliyor. O da butun herkesin widgetini siliyor. Yol biraz uzun ama yapacak bir sey yok gibi.
 
Hocam cok tesekkur ederim boyle bir detayli aciklama icin. Ornegin butun playerlarin widgetini silmek istedigimde widgetler replication olmadigi icin cozemiyordum. Sizden aldigim yontem ile nasil yapacagimi buldum. Ornegin son secimi client 2 yapti ve sonra butun widgetler silinecek. Butona basinca pc deki serverda calisan custom eventi tetikliyorum. Bu da game mode a erisip oradan playerArray ile pc deki multicast olan bi custom eventi tetikliyor. O da butun herkesin widgetini siliyor. Yol biraz uzun ama yapacak bir sey yok gibi.
Evet doğru yapmışsın. Artık herşeyi bu kafa ile düşünmen ve ona göre bir yol bulman gerekiyor.
 
  • Beğen
Tepkiler: gamemaxs