serhatwxe

Unreal MVP
3 Ocak 2016
317
1
53
28
(34) İstanbul Avrupa
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.

resim-2020-10-21-131322.png


foto2.png



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?
 
serhatwxe' 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.

resim-2020-10-21-131322.png


foto2.png



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.
 
erginegider' Alıntı:
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.

Yazdıkların çok mantıklı geldi ve tam da istediğim şey. Bu SatinAlinanSilah'ı Array yaptım. Default Value olarak 1911 ekledim. Butona basınca bu listeye misal Deagle eklemek için Add Item ekliyorum. Bilmiyorum sanırım çok yanlış anladım zira bu terimleri bilmediğim için her biri için ayrı video izledim. Olay örgüsü kafamda toparlandı ama bilgisizlikten hareket edemiyorum. Widget'in begin playine For Each Loop ekledim Array'ina bu oluşturduğum arrayi Get ettirdim. Switch oluşturup For Each Loop'un Array Element'ini buna bağladım. Döngü çalışmıyor. Bana buradan mantıklı gözüküyor ama sanırım bu oradan çok mantıksız gözüküyor. Benim anladığım şu, Array bir dizi oluşturmamızı sağlıyor bu diziyi Silah Enum'dan çekiyoruz. Butona basınca diziye yeni bir item ekleyip Satin Al butonunu gizliyoruz. Leveller arası geçişte örneğin Widget tekrar açılınca ForEach döngüsü sayesinde sorguya çekip 1911 aktif ise butonu gizle, Deagle aktif ise butonu gizle diye diye otomatik olarak döngüyü tamamlıyoruz.

Structure vs. kullanmadığım için mi, mantık var ama bilgisizlikten mi yapamıyorum anlamadım. (Yoksa her ikisi de mi yok  :D  )
 
serhatwxe' Alıntı:
erginegider' Alıntı:
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.

Yazdıkların çok mantıklı geldi ve tam da istediğim şey. Bu SatinAlinanSilah'ı Array yaptım. Default Value olarak 1911 ekledim. Butona basınca bu listeye misal Deagle eklemek için Add Item ekliyorum. Bilmiyorum sanırım çok yanlış anladım zira bu terimleri bilmediğim için her biri için ayrı video izledim. Olay örgüsü kafamda toparlandı ama bilgisizlikten hareket edemiyorum. Widget'in begin playine For Each Loop ekledim Array'ina bu oluşturduğum arrayi Get ettirdim. Switch oluşturup For Each Loop'un Array Element'ini buna bağladım. Döngü çalışmıyor. Bana buradan mantıklı gözüküyor ama sanırım bu oradan çok mantıksız gözüküyor. Benim anladığım şu, Array bir dizi oluşturmamızı sağlıyor bu diziyi Silah Enum'dan çekiyoruz. Butona basınca diziye yeni bir item ekleyip Satin Al butonunu gizliyoruz. Leveller arası geçişte örneğin Widget tekrar açılınca ForEach döngüsü sayesinde sorguya çekip 1911 aktif ise butonu gizle, Deagle aktif ise butonu gizle diye diye otomatik olarak döngüyü tamamlıyoruz.

Structure vs. kullanmadığım için mi, mantık var ama bilgisizlikten mi yapamıyorum anladım. (Yoksa her ikisi de mi yok  :D  )
    Dostum sen de hiç sıkıntı yok, bu işler zor. Genel olarak konuyu anlamış gözüküyorsun ki bu ilk adım tamam demek. Döngü çalışmıyor demişsin ama çalışmıyor derken nasıl yani. İşlev oraya hiç ulaşmıyor mu. Dizin mi boş yani içinde eleman mı yok. Döngü çalışıyor ama istediğin işlevi mi yerine getirmiyor. Debug yaparak önce yazdığın koda işlev ulaşıyor mu onu kontrol et.
Her adım da hangi değer ne oluyor debug modda görebilirsin. İlgili yerlere breakpoint ve print string ler ekle. Böylece hangi aşamada nerede hata oluyor bunları görebilirsin. Adım adım git. Önce butona tıklandığında diziye eleman eklenmesi olayı çalışıyor mu bunu bir hallet. Bu halledildikten sonra ikinci aşamaya geç. İstediğin yerde hepsini bir döngü ile adını ekrana yazdır. Bunu da hallettikten sonra kontrol sistemini kur. En son widget açma kapama olayına geç.
   Her aşamayı tek tek emin olarak geçersen hedefe ulaşırsın.
  Kısa bir video ile göstermek istedim ama bugünler de ne vaktim ne de sağlığım müsaade etmiyor.
   Yine yapamassan discorddan falan bir ara bakarız direk.
Kolay gelsin.
 
erginegider' Alıntı:
    Dostum sen de hiç sıkıntı yok, bu işler zor. Genel olarak konuyu anlamış gözüküyorsun ki bu ilk adım tamam demek. Döngü çalışmıyor demişsin ama çalışmıyor derken nasıl yani. İşlev oraya hiç ulaşmıyor mu. Dizin mi boş yani içinde eleman mı yok. Döngü çalışıyor ama istediğin işlevi mi yerine getirmiyor. Debug yaparak önce yazdığın koda işlev ulaşıyor mu onu kontrol et.
Her adım da hangi değer ne oluyor debug modda görebilirsin. İlgili yerlere breakpoint ve print string ler ekle. Böylece hangi aşamada nerede hata oluyor bunları görebilirsin. Adım adım git. Önce butona tıklandığında diziye eleman eklenmesi olayı çalışıyor mu bunu bir hallet. Bu halledildikten sonra ikinci aşamaya geç. İstediğin yerde hepsini bir döngü ile adını ekrana yazdır. Bunu da hallettikten sonra kontrol sistemini kur. En son widget açma kapama olayına geç.
   Her aşamayı tek tek emin olarak geçersen hedefe ulaşırsın.
  Kısa bir video ile göstermek istedim ama bugünler de ne vaktim ne de sağlığım müsaade etmiyor.
   Yine yapamassan discorddan falan bir ara bakarız direk.
Kolay gelsin.



Müsait olduğun bir zaman artık, ufak bir göz gezdirirsin yorumuma hocam. Geçmiş olsun umarım iyileşirsin.
----
Deagle satın al butonuna basınca print string 1 yansıyor, Keles satın al basarsam print string 2 yansıyor. Yani her bastığımda sayı 1 artıyor. BP:
pp2.png


Levele tekrar başlayınca Satın Al butonları gizlenmiyor. Widget başlayınca bu sorguyu göstermesini istedim:

pp1.png
 
serhatwxe' Alıntı:
erginegider' Alıntı:
    Dostum sen de hiç sıkıntı yok, bu işler zor. Genel olarak konuyu anlamış gözüküyorsun ki bu ilk adım tamam demek. Döngü çalışmıyor demişsin ama çalışmıyor derken nasıl yani. İşlev oraya hiç ulaşmıyor mu. Dizin mi boş yani içinde eleman mı yok. Döngü çalışıyor ama istediğin işlevi mi yerine getirmiyor. Debug yaparak önce yazdığın koda işlev ulaşıyor mu onu kontrol et.
Her adım da hangi değer ne oluyor debug modda görebilirsin. İlgili yerlere breakpoint ve print string ler ekle. Böylece hangi aşamada nerede hata oluyor bunları görebilirsin. Adım adım git. Önce butona tıklandığında diziye eleman eklenmesi olayı çalışıyor mu bunu bir hallet. Bu halledildikten sonra ikinci aşamaya geç. İstediğin yerde hepsini bir döngü ile adını ekrana yazdır. Bunu da hallettikten sonra kontrol sistemini kur. En son widget açma kapama olayına geç.
   Her aşamayı tek tek emin olarak geçersen hedefe ulaşırsın.
  Kısa bir video ile göstermek istedim ama bugünler de ne vaktim ne de sağlığım müsaade etmiyor.
   Yine yapamassan discorddan falan bir ara bakarız direk.
Kolay gelsin.



Müsait olduğun bir zaman artık, ufak bir göz gezdirirsin yorumuma hocam. Geçmiş olsun umarım iyileşirsin.
----
Deagle satın al butonuna basınca print string 1 yansıyor, Keles satın al basarsam print string 2 yansıyor. Yani her bastığımda sayı 1 artıyor. BP:
pp2.png


Levele tekrar başlayınca Satın Al butonları gizlenmiyor. Widget başlayınca bu sorguyu göstermesini istedim:

pp1.png

Sorun construct ın sadece başta çalışmasından. Sen basmadan çalıştığı için sonradan bassan da dizi boş. Öyle tahmin ediyorum. Bu ikinci resimdeki kodu bir fonksiyon hâline getir. Birinci resimdeki kodun en sonuna ekle. Daha sonra beginplay vb diğer gerekli gördüğün  her yerden çalıştır. Doğru yolda gözüküyorsun.
İyi dileklerin içinde teşekkür ederim.