(21-10-2020, Saat: 13:10)serhatwxe Adlı Kullanıcıdan Alıntı: Oyuncu misal Deagle adlı silahı satın al tuşuna bastığı zaman "Deagle'ı Satın Al" butonunun gizlenmesini istiyorum. Basınca gizleniyor. Level değişikliği sırasında biliyorsunuz tüm sistem yenilendiğinden ve bu buton Save Sistemine kayıtlı olmadığından tekrardan gözüküyor.
Ana Menu widgetinin başlangıcına bunu koyuyorum ve diyorum ki satın alınan silah Deagle ise Deagle'ı gizle. Gerçekten Deagle satın almışsa level değişikliği olsa bile satın al butonu gizleniyor. Ama sıkıntı şu ki herif hem Keleş, hem deagle almış olabilir. Bu mantıkla oyun başlar başlamaz en son satın aldığı silah hangisi ise sadece onun satın al butonu gizlenecek.


Hem Deagle, hem Keles ya da hem 1911, hem Deagle gibi kombinasyonların silah sayısının bir kaç tane daha arttığını düşününce işin içinden çıkılmaz bir hal alıyor. Keşke bu visibileın kendisi save sisteminin içinde olsa. Umarım sorunumu anlatabilmişimdir. Sizce ne yapabilirim?
Bence şöyle yapsan daha kolay olur:
1. SaveRef te SatinAlinanSilah yapmışsın ya. Onu Array yani dizi yap. Herhangi bir silah satın alındığında bu diziye o silahın değeri ne ise o eklensin. O zaman senin SaveRef ( Bu bir savegame object herhalde öyle tahmin ediyorum ) inde bir dizi olacak ve adam mesela 3 silahı da almışsa {Deeagle, Keles, 1911} gibi bir dizin olmuş olacak.
2. Ana menu widgetın önce hepsi görünmez olarak yani hidden olarak başlayacak. Ancak ondan sonra tek bir fonksiyonun olacak ve bu dizide neler var ise onun widget ı görünür hale getirilecek. DeagleSatinAlindi 1911SatinAlindi vb. gibi ayrı ayrı fonksiyonların hepsi kalkacak yerine tek bir fonksiyon gelecek yani. Burada foreach ile dizinin her elemanına ulaşacaksın, silah tipini eleman üzerinde kontrol edeceksin (burda switch kullanabilirsin) listede bulduğun widgetların görünürlük durumu "visible" a dönecek.
3. Burada FPS karakterde yaptığın o fonksiyonlara hiç gerek yok. Çünkü zaten AnaMenu üzerinde bir şey yapmak istiyorsun. Ama AnaMenuden Karakter üzerindeki değişik fonksiyonlara gidiyorsun. Orada tekrar "GetAllWidgetClass" ile AnaMenu ye ulaşmaya çalışıyorsun ve oradaki widgeti hidden hale getiriyorsun. Bu sırada gittiğin Karakter ile ilgili de hiç bir şey yapmıyorsun orada. Bunu yerine FPS deki tüm ilgili kodu silip herşeyi Widget ta halledebilirsin. Zaten Karakterden bir şey almıyorsun orada. Eğer oldu ki AnaMenude Karakterdeki bir değişkene yada başka bir şeye ihtiyaç duydun. Bu durumda GetPlayerCharacter den FPS ye cast yaparak istediğin herşeye oradan da ulaşabilirsin. Yani bence Karakterindeki koda gerek yok. Sadece AnaMenude "AlinmisOlanlariAc" gibi bir fonksiyon kullanabilirsin. Hatta ona bile gerek yok herşeyi orada OnConstruct ta da halladebilirsin.
Bu yukarıda anlattıklarım senin şu an bulunduğun konuma göre en kolay gidiş yolu. Benim kendi oyunumda da böyle bir durum var ve ben mantığı şöyle kuruyorum:
1.PlayerController da bir Inventory dizisi var. Kim bir şey satın alırsa Inventory dizisine direk primarydataasset olarak giriyor. Yani bir enum değil PrimaryDataAsset dizisi ni playercontroller da tutuyorum. Birşey alınca oraya bir tane yaratıp ekliyorum. Bu PrimaryData asset te objenin kendisi hangi silah sa o oluyor. Ona ait bir button resmi ve menu de gözükecek diğer özelllikleri oluyor (mesela mermi miktarı fiyatı vb.).
2. Widget ilk kurulurken yani onConstruct ta karakterin playercontroller ına gidiyor. Oradan Inventory yi buluyor. Onun içindeki PrimaryDataAssetleri tek tek okuyarak her biri için yeni bir widget yaratıp ekrana koyuyor.
3. Birde PlayerInstance ta aynı bunun gib FullInventory diye bir başka listem var. Sistemdeki tüm malzemeler alınsın alınmasın hepsi bunun içinde bulunuyor. Market ekranında FullInventory içinden karakter Inventory sinde olmayanları satın alınabilecek şekilde gösteriyorum, alınmış olanları ise "Equipped" yani alındı diye yazıp soluk resimle gösteriyorum widgetta.
Kolay gelsin.