leonscottkfm

Unreal MVP
31 May 2015
1,539
5
219
63
28
(34) İstanbul Avrupa
store.steampowered.com
Ben server kurucusuyum diyelim. Tüm oyuncuları nasıl yanıma ışınlarım ? KarakterBP olarak for ile hepsini teleport edersem bende onu kullandıgım için kendimide ediyorum. Is server diye kontrol  edersem de bir şey olmuyor . Nasıl oyuncuyu sunucudan ayırt ederiz ki ?
 
switch has authority ile deneyebilirsin yada şöyle bir şey deneyebilirsin oyuncuları tuttuğun bir array vardır ilk index server olur, index'i 0 dan değilde 1 den başlatırsın.
 
MaxPlayers nedir tam anlayamıyorum burdan. Eğer Player controller dizisi ise orada sorun olmaya bilir. GetPlayerController her zaman PlayerController gönderir. Tipler arasında uyumsuzluk olma ihtimali görüyorum. Eğer MaxPlayers gerçekten PlayerController dizisi ise ismini PlayerControllerArray diye versen daha anlaşılır olur.
PlayerController lara ulaşmanın yolu:
  GameState->PlayerArray -> ForEach ->GetPlayerController

  Eşitlik karşılaştırmalarda eşitliğin iki yanının da dolu olduğunu ve tiplerin aynı olduğunu kontrol etmek gerekir.
 
MaxPlayers dediğim yer OnPostLoginden çekilmiş tüm oyuncu PC leri.




GameModede yapılmıyor mu bu işlem ? Ben hiç playerstate kullanmam.


Kod çalıştı nasıl oldu anlamadım ne mantığı var ? Gamemodede de playercontroller çekmiyor muyuz zaten ?




Karşıdaki elemanda ışınlama yapabiliyor ama. Sadece server yapabilmeli bunu.

Işınlama tuşuna is server koydum şimdi sadece server çekebiliyor.

Ama ben mesela tüm oyuncuların canını değiştireceğim diyelim ki. Bu şekilde yapamayız ki ? Onların thirdpersonbp sine ulaşmam gerekecek çünkü verileri orada tutuyorum ben. O nasıl olacak peki ? Bu PlayerController üzerinden işlem yaptığı için teleport destroy falan edebilir ama o özel verilere ulaşamam buradan.


Bu arada benim yaptığımı editledim o da düzeldi. GetPlayerController demeden direkt mavi düğümden çektim




Oto playerstate çekti zaten kendisi.
ikiside aynı işlevi görüyor yani şuan.
 
Neredeyse her şeyden her şeye ulaşma yöntemi vardır. BP de biraz daha az opsiyon var ama yine de bir sürü ulaşma şekli var.
  Örneğin PlayerController dan Character i ne ulaşmak istediğinde GetControlledPawn, karakterinden controller a ulaşmak istediğinde GetController kullanabilirsin. Çoğu yerden GetGameMode ve GetGameState çalışır. GameState te PlayerArray değişkeninde tüm PlayerState ler zaten hazırda listelidir. PlayerState ten GetPlayerController la Controllera ya da GetPlayerPawn ile karakterine ulaşabilirsin. Bunlar sadece birer örnek. İşimiz neyi gerektiriyorsa ona göre istediğimiz şeyi kullanırız.
  Aynı şeyi GetAllActorsOfClass gibi bir şeyle de yapabilirdin teknik olarak. Ama gerek yok. Herkeste zaten GameState var ve PlayerArray zaten istediğin listeyi sağlıyor. C++ ta biraz daha direk yöntemler de var (PlayerController Iterator vb.). Muhtemelen bir iki başka yöntem daha vardır şimdi hatırlamadığım.
 Not: Ne fark var demişsin. Fark sadece, OnPostLogin de Controller ları toplamana gerek yok. Zaten toplanmışı var. Eğer eski kodunda başka yanlışın yoksa benim gördüğüm başka bir fark ta yok.
 
Evet gelen sınıf her zaman base sınıf olacaktır. Base sınıfın bir özelliğini kullanacaksan gerek yok. Mesela MaxWalkSpeed gibi CollisionCapsule gibi. Ama kendi yaptığın yeni sınıfa ve kendi yaptığın bir özelliğe erişmek istiyorsan Cast To ile onu senin sınıfına çevirmen gerekiyor.
 
Heh bunu söylemen yeterli aynı şekilde gamemodeye falanda öyle erişiyoruz eğer özel bir gamemode yoksa default var zaten mesela.Ama o default olanında ince özelliklerine erişemiyoruz.
Böyle olması iyi olmuş.Çok soru sorduk senide yorduk ama son bir şey daha soracağım. Playercharacterbp içerisinde hangi şeyler tutulur ? Can değeri orada tutulur mu mesela ?
Ben bir çok şeyi orada tutuyorum Aim alma olsun tuşlar olsun hit yeme olsun vb şeyler. Anahtar var mı yok mu diğer tüm booleanları falan orada tutuyorum ben.
 
Teknik olarak bilgilerin nerede saklanacağına dair bir gereklilik yok. Ancak problem başka yerde:
  1. Bütün yazılım yapma süreçleri önce basit başlar sonra zamanla karmaşıklaşmaya, dallanıp budaklanmaya başlar. İşin doğası böyledir. Siz yeni özellikler, işlevler ekledikçe sistemler ve sistemleri kuran kodlar karmaşıklaşır içe içe girmeye, bir birini etkilemeye ve sıkıntı çıkarmaya başlar. Bunlar ilk günlerde değil daha sonraları proje ilerledikçe ortaya çıkar. Bu sadece oyunlar için değil her türlü yazılım projesi için geçerlidir. Yani ister Amazon Web Services ister Android ister IOS olsun, ister chrome programlayın ne yaparsanız yapın doğası gereği her şey karmaşıklaşır. Bu öyle bir noktaya gelebilir ki, sonucunda o hep duyduğunuz iptal edilen oyunlar, yeni versiyonu yapılmayan programlar, daha kötüsü de çıkarıldığı halde bug ları yüzünden hiç alınmayan ürünler ortaya çıkabilir. Yazılım şirketlerinin bir numaralı düşmanı da budur. (Sonunca ya örnek MODO, Oyunlara örnek için google a bakabilirsiniz)
  2. Yukarıda anlattığım şeyler yüzünden önce OOP konsepti sonra SOLID prensipleri gibi bir çok kavram ortaya çıkmıştır. İşini önemseyen programcılar bunlara 4 elle sarılırlar. Çoğu profesyonel oyun şirketine bu prensiplere uygun kod yazmıyorsanız almazlar. Kodunuz çalışsa da almazlar. Örneğin ben almıyorum. Bildiklerimden alanı da görmedim.
  3. OOP ve SOLID vb. programlama konseptleri ise en başta "single responsibility" yani "tek sorumluluk" ile konuya girerler. Hatta SOLID in başında ki S bile odur. İşlerin mantıklı ve düzgünce parçalanıp sorumluluğun başka başka objelere verilmesi, sistemlerin iç içe geçmesi, birbirine minimum etki etmesi için şarttır. Ancak bu şekilde yazılımcılar artan karmaşıklıkla, projenin arap saçına dönmesiyle başa çıkabilirler. Örneğin bu sayede 10000 inci özellik eklenmesine rağmen halen Maya ayakta ve ayakta olacak,  ama Modo çöküyor. Ya da çok karmaşık ve komplex oyunlar piyasaya çıkabiliyor.
  4. Profesyonel dünyada alt sistemlerin hep C++ la kurulması, sadece üst sistemlerin ve sürekli değiştirelecek şeylerin BP ye bırakılmasının sebebi de büyük oranda bu. (Başka bir çok faydası da var ama burda konumuz değil)
  Şimdi soruna gelecek olursak. Teknik olarak her yere her bilgiyi koyabilirsin. Bu birazda oyunun kapsamına büyüklüğüne bağlı. Bomber man gibi basit oyunlarda her yere koyabilirsin de diyebilirim, ama oyun büyüdükçe neyi nerde tuttuğun daha önem kazanır. Mantıklı yerde olmayan şeyler olayı daha da komplex leştirmeye ve yukarıda saydığım sıkıntılı şeylere götürür.
 En baştan Epic Games tüm sistemi dizayn ederken, her class için farklı bir maksat düşünerek ortaya çıkarmış.
 Genel olarak:
 Karakter: Görsel ve Animasyon temsili, puppet, kukla
 PlayerController: Oyunu oynayan kişinin ta kendisi. Bu yüzden net connection, player input, kamera vb.
 PlayerState: Oyunu oynayan kişinin datası yani bilgileri. Health, Damage Power, kaç altını olduğu, hangi görevleri bitirmiş olduğu vb.
 GameState: Oyuncuya ait değil de herkese ait olan data nın tutulduğu, mesela hangi takım kaç puanda, oyun başlayalı kaç dakika oldu, oyun alanında kalan altın miktarı nedir vb. (Ayrıca tüm PlayerState ler)
 GameMode: Oyunun kuralları ve işleyişini yukarıdan belirleyen işlevler içeren class. Mesela Team Death Match mı, single player mı, Free for All mu. Bunlara ait işlevler ve kurallar bütünü
 Oyunum komplex olacaksa PlayerState te tutarım canımı. Daha basitse ve sırf bir tane şey için playerstate oluşturmak istemiyorsam PlayerControllera. Oyunum çok çok daha basitse ve hiç bir komplexlik olmayacaksa üçüncü tercih olarak karakter de tutardım. Yani tercih sırası PlayerState -> PlayerController -> PlayerCharacter. Oyunum daha da profesyonel, uzun soluklu ve karmaşık olacaksa PlayerState içinde sırf bu bilgiler için ayrı bir obje de tasarlayabilirdim (GAS sistemindeki Attribute sınıfı gibi)
 Tüm bunlar oyunun tarzına da bağlı. Bir RTS için tek bir işçinin canı karakter de durması daha mantıklı olabilir. Bir oyuncunun playerstate inde 250 askerinizin canını tutmaya çalıştığınızı düşünün. Yada karakteri değiştirebildiğimiz bir multiplayer oyunda playercharacter, playercontroller ın bu konuda önüne geçebilir. En başta anlattığım gibi, ana maksat kompleksliği azaltmak, yönetilebilir halde tutmak. Bunlar sağlandığı sürece yukarıda ki bilgiler ışığında karar vermek size kalıyor.
 
Doğrudur ama bu uzun ve zor bir konu hemen yapılacak bir şey değil. Dolayısıyla baştan planlamak lazım projeyi. Playercontroller kullanıyordum başta inputlar için ama Widgetlarda sorun çıkarıyor o. Mesela bir widgeti event beginde oluşturuyorum tuşa basınca animasyonu devreye girsin istiyorum ama playercontrollerde event beginde widget oluşturamıyorsun Local_PC hatası veriyor. Sadece tuşla çalışan widget yapabiliyorsun. Bende böyler incik cincikle uğraşmamak için temel kontrolleri PC ye verdim diğer widget vs gibi fonksiyonel inputları playrcharactere verdim.
Benim oyunum bu yaz bitecek büyük ihtimalle çok kompleks olmayacak. Sadece can değeri mermi anahtar gibi şeylerden oluşuyor ve yapay zeka önemli olan.
Zaten basit bir korku oyunu ve EarlyAccess olarak çıkacak ama ben olabildiğince oyun uzun olsun ve zorlayıcı olsun istiyorum. Zaten görselliğe ve fizik gibi şeylerede önem verdim ki insanlar oynayıp sorun görse bile diğerlerinden daha iyi olmuş diyebilsinler en azından özen verilmiş geliştirilir bu desinler güven kazansınlar diye her şeyi sağlam yapmaya çalışıyorum.
İşler kompleksleşmesin diye bir çok şeyi grapha alıp commentliyorum.Bir süre bu şekilde çalışabiliriz bence.
Ben çoğu şeyi yapabiliyorum ama hep SOLID prensibinden kaybediyorum. Nizami bir şeyim yok genelde saçma yerlerden saçma veriler çekip farklı yöntemler uygulayabiliyorum. Bunlarda bug ve sorun çıkarabiliyor.
Mesela sen demişsin ki GameStatede oyun süresi gibi şeyler olabilir. Ben onu da GameMode de yaptım mesela, bana bir zararı olmadı ama doğru bir yol değildi.Mesela yaptığım o saat fonksiyonu fps si düşük olanlar için birkaç saniye geriden gelebiliyor. Bunu GameStatede yapsam bu engellenecek miydi ?
 
Hayır GameState te yapsan da aynı olacaktı. Yukarıda bahsettiğim şeyler geliştiricilerin akıl sağlığına ve projenin akıbetine hizmet eder sadece. Yanlış olan bir fonksiyonun düzelmesini sağlamaz. Bu arada Widgetlar için neredeyse her zaman PlayerController en iyi yerdir. Bahsettiğin hatayı ilk defa duyuyorum. Her hangi bir sıkıntı çıkmaması lazım normalde. Eğer sistemin çalışıyorsa sıkıntı yok gerçi.