Tanhu

Unreal MVP
22 Tem 2015
208
34
0
Belirtilmemiş
Merhaba. Action RPG Inventory system kullanan varsa ve bunu yapmışsa bana çok yardımcı olabilir.

Oyun içerisinde pek çok konteynır bulunmakta ve istediğin zaman daha fazlasını ekleyebiliyorsun. Bu konteynırlarda eşya depoluyoruz. Inventory adında bir struct array variable var, doğru mu ifade ettim bilmiyorum ama anlaşılmıştır herhalde. Bu Inventory arrayi, bir slotu baz alıyor, array olduğu için pek çok slota dönüp envanteri oluşturuyor. Sıkıntı şurada ki, ben bu konteynırların sadece birini kaydedebiliyorum, oysa çok konteynır var ve her biri ayrı kaydedilmeli. Çok oyunculuda farklı oyuncuların envanterlerinin hepsinin ayrıca kaydedildiği ama bunların tek kayıt dosyası altında tutulup dağıtıldığını düşünün. İşte benim yapmak istediğim bu.

Şimdi, Inventory değişkenini başka bir struct içine almaya kalksam, o structu variable yapıp array haline getirsem diye düşündüm ama bunu ben nasıl oraya yönlendirir ya da toplarım bilemedim.

Bir fikriniz varsa yardımcı olursanız çok büyük bir sorunu çözmüş olurum. Alternatif çözümüm var, mesela kayıt işlemini sandık bpsine yerleştirip, self üzerinden ismi çekerek eşyaların leveldaki isimleriyle ayrı kayıt dosyaları halinde kaydedilip yüklenmesini sağlayabilirim. Ama bu çok kayıt dosyası oluşmasına sebep olur ve bunu da pek isteyeceğimi zannetmiyorum. Ama tabi bir şey bulamazsam mecbur bunu uygulamam gerekecek.

Bu işten anlayan varsa proje dosyasını da atabilirim özelden.
 
Görsel vereyim;

41qRq4.jpg


Sol alttaki değişkenler belli olduğu üzere konteynırın kaç slot olduğu gibi şeylerle alakalı. Açılı sayfa Container_Actor, parent class olarak pot olur sandık olur haritaya dağılmış durumda. Inventory Component üzerinden envanter değişkeni çekiliyor, bunu göstermek için gride sürükledim.

JqkEko.jpg

Bu da o değişken. 0, ilk slot oluyor. Onun içinde de itemi oluşturan bilgiler depolanıyor.

İşte sorun da tam burada başlıyor. Tek bir sandığı kaydedecek olsam işlem çok basit, direk bir kayıt yapacağım ve bilgiler sadece o sandıktan alınıp o sandığa gönderilecek. Inventory değişkenimiz de array olduğunda içinde daha fazla slot tutuyor. Bu durumda düz mantık belki Inventory'i içinde tutan başka bir üst array yapsam ne olur diye düşündüm ama bunu nasıl yapacağım gibi pek çok alanda hiç bir bilgim yok. O kadar iyi bilemiyorum maalesef. Ya da mesela haritadaki objelerin konumunu kaydedecek olsak Get All Actors of Class tarzı bir yöntem kullanırdım, ama burada iki farklı array söz konusu.

9gqpg5.jpg


Mesela normal envanteri çok hızlı kaydedebiliyorum, onu göstermek için yukarıdakini attım. Ama olay daha fazla oyuncunun envanterini ya da daha fazla sandığı tutmaya geldiğinde bozuluyor.
 
Tanhu' Alıntı:
Merhaba. Action RPG Inventory system kullanan varsa ve bunu yapmışsa bana çok yardımcı olabilir.

Oyun içerisinde pek çok konteynır bulunmakta ve istediğin zaman daha fazlasını ekleyebiliyorsun. Bu konteynırlarda eşya depoluyoruz. Inventory adında bir struct array variable var, doğru mu ifade ettim bilmiyorum ama anlaşılmıştır herhalde. Bu Inventory arrayi, bir slotu baz alıyor, array olduğu için pek çok slota dönüp envanteri oluşturuyor. Sıkıntı şurada ki, ben bu konteynırların sadece birini kaydedebiliyorum, oysa çok konteynır var ve her biri ayrı kaydedilmeli. Çok oyunculuda farklı oyuncuların envanterlerinin hepsinin ayrıca kaydedildiği ama bunların tek kayıt dosyası altında tutulup dağıtıldığını düşünün. İşte benim yapmak istediğim bu.

Şimdi, Inventory değişkenini başka bir struct içine almaya kalksam, o structu variable  yapıp array haline getirsem diye düşündüm ama bunu ben nasıl oraya yönlendirir ya da toplarım bilemedim.

Bir fikriniz varsa yardımcı olursanız çok büyük bir sorunu çözmüş olurum. Alternatif çözümüm var, mesela kayıt işlemini sandık bpsine yerleştirip, self üzerinden ismi çekerek eşyaların leveldaki isimleriyle ayrı kayıt dosyaları halinde kaydedilip yüklenmesini sağlayabilirim. Ama bu çok kayıt dosyası oluşmasına sebep olur ve bunu da pek isteyeceğimi zannetmiyorum. Ama tabi bir şey bulamazsam mecbur bunu uygulamam gerekecek.

Bu işten anlayan varsa proje dosyasını da atabilirim özelden.

Aşağıdaki bazı noktaları aydınlatırsanız yardımcı olabilirim. Ayrıca oyunun türüne göre daha iyi bir Item System önerebilirim.
  • Neden bir karakter için birden çok envanter var? Bir tanesi yeterli değil mi?
  • 1 envanteri kaydedebiliyorken birden çok sayıda olduğunda neden kaydedemiyorsunuz? Ne tür bir serialization kullanıyorsunuz? SaveGame nesnesinin farklı versiyonlarını oluşturup her türden kompleks verileri tek bir dosyada binary olarak kaydedebilir ve rahatça tekrar okuyabilirsiniz.
 
cahitburak' Alıntı:
Aşağıdaki bazı noktaları aydınlatırsanız yardımcı olabilirim. Ayrıca oyunun türüne göre daha iyi bir Item System önerebilirim.
  • Neden bir karakter için birden çok envanter var? Bir tanesi yeterli değil mi?
  • 1 envanteri kaydedebiliyorken birden çok sayıda olduğunda neden kaydedemiyorsunuz? Ne tür bir serialization kullanıyorsunuz? SaveGame nesnesinin farklı versiyonlarını oluşturup her türden kompleks verileri tek bir dosyada binary olarak kaydedebilir ve rahatça tekrar okuyabilirsiniz.

1 - Oyuna co-op desteği vermeyi planlıyorum. Yani bir karakter için değil, diğer karakterler için her bir karakteri ayrı tutacak bir kayıt sistemi istiyorum. Oyuncu1'de şemsiye varken Oyuncu2'de elmayla portakal vardır mesela. Farklı itemlara sahipler, ancak kayıt dosyası yalnızca bir dosya halinde saklanıyor. Her oyuncuya ayrı bir kayıt dosyası oluşturmak istemiyorum. Online oyunlarda verilerin bir noktada toplanması gibi düşünün. Ben farklı envanterleri, kaydetme işleminde isme self çekerek nesnenin adını almasını sağlayarak, yüklemede de aynısını yaptırarak kendi adından yükleme yapmasını sağlayabiliyorum. Bu da mesela karakterin leveldaki adı "Bobo" ise, savegames içinde "bobo.sav" gibi ayrı ayrı dosyaların oluşmasına sebep oluyor.

Oyunu hayatta kalmaya yakın bir tarzda geliştirmek istediğimden evrende pek çok sandık zamanla craftlanabilecek ya da yok edilebilecek. O konuları hallettim, orada bir sorunum yok. Fakat her envanterin tek dosyada toplanması takıldığım nokta.

2 - Çünkü Inventory adlı değişken, yalnızca slot bilgileri tutuyor. Mesela envanterin büyüklüğü 19 ise, 0'dan 19'a kadar slotlar oluşturup içerisine item bilgilerini dağıtıyor. Ortaya iki tane sandık koyduğumuzda bunları tek bir değişkene yönlendirirsek doğal olarak biri diğerini örtüyor, çünkü Inventory Array'i yalnızca slotları tutabilen bir array. Yukarıda bir görsel paylaştım, olay tam olarak oradaki gibi. +'ya basınca bir slot ekleyip içini dolduruyor. Benim bu soruna getirebildiğim tek çözüm, kayıt dosyasına, nesnenin evrendeki adını verdirerek her birini ayrı tutup ayrı yüklenmesini sağlamak. O da örnek olarak kaydı silmek istediğinde hepsinin silinememesine ya da bir daha bir boolen oluşturup etkileşim halinde tek tek sildirmeme sebep oluyor.

Açıkçası kodlamadan pek anlayamıyorum. Şuanki envanter sistemine pek çok şeyi dahil edebilirim ama işler karmaşıklaşınca takılıyorum. Şuana kadar pek çok sistem yaptım ama beni en çok zorlayan bu bahsettiğim kaydı yapmak, ki onu da yapamadım. Yoksa oyunda beni daha sonra zorlayacak hiçbir konu yok. Bunu yaptıktan sonrasını zaten demolar halinde önceden oluşturduğumdan ne yapmam gerektiğini biliyorum. Şuan tek aşmam gereken şey bu, bu konuda yardım alabilirsem benim için çok iyi olacak.
 
gigalian' Alıntı:
Anlaşamadık. Ben kendi oyunumda sadece Item ID ve miktar değişkenlerini kayıt ediyorum.. Diğerlerini kayıt etmemin hiç bir anlamı yok.

kbu5u.jpg

Envanter sistemini ben yazmadım, Action RPG Inventory System adında bir marketplace öğesi var, oradan satın aldım. Önceki sistem kullanışlı olmadığından, bolca olumlu dönüt almış bir envanter sistemini tercih ettim ve bu da böyle iş yapıyor. :)
 
Ard arda mesaj attığım için kusura bakmayın.

Sanırım istediğim tarzda bir yardım alamayacağım. Neyse o zaman bahsettiğim yöntemi uygulayayım, eğer aynı sorunla karşılaşan olur da çözemezse alternatif çözüm olarak;

o08JQk.jpg


Böylece haritada ne kadar sandık varsa her biri ayrı ayrı kaydediliyor. Aynı şekilde ayrı ayrı yükleniyor. Get All actors of class'tan for each loop çekip oradan delete game in slot kullanarak da aynı anda haritada ne kadar sandık varsa silebiliyorsunuz.

Şöyle bir sonucu oluyor tabi bu yöntemin;

r68GYN.jpg


Sonuçta kodlamacı değilim, kafam o tür şeylere pek çalışmıyor. Kıyısından köşesinden dolanıp çözüm bulmaya çalışıyorum onunla da bu kadar oluyor.  :D
 
Tanhu' Alıntı:
cahitburak' Alıntı:
Aşağıdaki bazı noktaları aydınlatırsanız yardımcı olabilirim. Ayrıca oyunun türüne göre daha iyi bir Item System önerebilirim.
  • Neden bir karakter için birden çok envanter var? Bir tanesi yeterli değil mi?
  • 1 envanteri kaydedebiliyorken birden çok sayıda olduğunda neden kaydedemiyorsunuz? Ne tür bir serialization kullanıyorsunuz? SaveGame nesnesinin farklı versiyonlarını oluşturup her türden kompleks verileri tek bir dosyada binary olarak kaydedebilir ve rahatça tekrar okuyabilirsiniz.

1 - Oyuna co-op desteği vermeyi planlıyorum. Yani bir karakter için değil, diğer karakterler için her bir karakteri ayrı tutacak bir kayıt sistemi istiyorum. Oyuncu1'de şemsiye varken Oyuncu2'de elmayla portakal vardır mesela. Farklı itemlara sahipler, ancak kayıt dosyası yalnızca bir dosya halinde saklanıyor. Her oyuncuya ayrı bir kayıt dosyası oluşturmak istemiyorum. Online oyunlarda verilerin bir noktada toplanması gibi düşünün. Ben farklı envanterleri, kaydetme işleminde isme self çekerek nesnenin adını almasını sağlayarak, yüklemede de aynısını yaptırarak kendi adından yükleme yapmasını sağlayabiliyorum. Bu da mesela karakterin leveldaki adı "Bobo" ise, savegames içinde "bobo.sav" gibi ayrı ayrı dosyaların oluşmasına sebep oluyor.

Oyunu hayatta kalmaya yakın bir tarzda geliştirmek istediğimden evrende pek çok sandık zamanla craftlanabilecek ya da yok edilebilecek. O konuları hallettim, orada bir sorunum yok. Fakat her envanterin tek dosyada toplanması takıldığım nokta.

2 - Çünkü Inventory adlı değişken, yalnızca slot bilgileri tutuyor. Mesela envanterin büyüklüğü 19 ise, 0'dan 19'a kadar slotlar oluşturup içerisine item bilgilerini dağıtıyor. Ortaya iki tane sandık koyduğumuzda bunları tek bir değişkene yönlendirirsek doğal olarak biri diğerini örtüyor, çünkü Inventory Array'i yalnızca slotları tutabilen bir array. Yukarıda bir görsel paylaştım, olay tam olarak oradaki gibi. +'ya basınca bir slot ekleyip içini dolduruyor. Benim bu soruna getirebildiğim tek çözüm, kayıt dosyasına, nesnenin evrendeki adını verdirerek her birini ayrı tutup ayrı yüklenmesini sağlamak. O da örnek olarak kaydı silmek istediğinde hepsinin silinememesine ya da bir daha bir boolen oluşturup etkileşim halinde tek tek sildirmeme sebep oluyor.

Açıkçası kodlamadan pek anlayamıyorum. Şuanki envanter sistemine pek çok şeyi dahil edebilirim ama işler karmaşıklaşınca takılıyorum. Şuana kadar pek çok sistem yaptım ama beni en çok zorlayan bu bahsettiğim kaydı yapmak, ki onu da yapamadım. Yoksa oyunda beni daha sonra zorlayacak hiçbir konu yok. Bunu yaptıktan sonrasını zaten demolar halinde önceden oluşturduğumdan ne yapmam gerektiğini biliyorum. Şuan tek aşmam gereken şey bu, bu konuda yardım alabilirsem benim için çok iyi olacak.

Görünüşe göre TheSaveGame isimli SaveGame Blueprint Class'ında Inventory isimli bir Property bulunuyor ve muhtemelen dediğiniz üzere bu bir Slot dizisi yada Itemı temsil eden nesne dizisi. Yapmanız gereken bunu bir Inventory dizisine yani Slot dizi dizisine çevirmek. Bu dizinin 0. elemanı 0. oyuncunun envanterini yani Item dizisini, 1. elemanı da 1. oyuncunun envanterini tutuyor olacak. Basitçe dizi içinde dizi... Ek programlamaya ihtiyacınız yok.
 
Dün bir struct oluşturup inventory'i ona aldım, all actors ile haritadaki her envanterden inventory'i çekmesini sağlayıp indexlerine göre tekrar dağıtmasını denedim ve tek dosyada toplamayı başardım. Nasıl bunu gözden kacirmisim bilemiyorum ama oldu, tek sorun olabilecek olan şey bir envanter daha spawnlandiginda ya da destroy edildiğinde bunun kaydedilmeden tekrar yüklenmesi. O zaman indexler şaşırıyor onun için de birkaç düzenleme yapıp neyin destroy edildiğini de kaydetmem gerekecek. Kısaca çözümü basitmis structa arrayi yerleştirip doğru indexlere dağıtmak.

Teşekkürler her şey için.
 
Tanhu' Alıntı:
Dün bir struct oluşturup inventory'i ona aldım, all actors ile haritadaki her envanterden inventory'i çekmesini sağlayıp indexlerine göre tekrar dağıtmasını denedim ve tek dosyada toplamayı başardım. Nasıl bunu gözden kacirmisim bilemiyorum ama oldu, tek sorun olabilecek olan şey bir envanter daha spawnlandiginda ya da destroy edildiğinde bunun kaydedilmeden tekrar yüklenmesi. O zaman indexler şaşırıyor onun için de birkaç düzenleme yapıp neyin destroy edildiğini de kaydetmem gerekecek. Kısaca çözümü basitmis structa arrayi yerleştirip doğru indexlere dağıtmak.

Teşekkürler her şey için.

Bu durumda da çözüm neyin kaydedildiğini de kaydetmek. Madem bir struct hazırladınız bu struct üzerinde Inventory ve bunun kime yada hangi nesneye ait olduğunu kaydedebilirsiniz. Aşağıdaki gibi;

InventorySaveData(struct)
|- Owner: Actor yada PlayerIndex
|- Inventory

Ardından SaveGame üzerinde bir adet InventorySaveData dizisi oluşturabilirsiniz.

Unutmayın ki SaveGame üzerine level üzerindeki bütün dinamik actorleri bile kaydedebilirisiniz, sadece Save/Load süreleri biraz uzar.
 
Yarın ilk işim bunu uygulamak olacak. Bu mantıkla çok oyunculu için de pek çok sorunu gidermiş olacağım. Yere atılan eşyaları kaydetmem, etkileşime geçilecek objeler ve envanterler skor zaman gibi şeylerle kısıtlı tutar tasarruflu davranirim olabildiğince. En nihayetinde en çok takildigim problemi çözebilmek iyi oldu.