Komunikacja pomiędzy widżetami utworzonymi w tym samym Actorze


#1

Dzień dobry. Przychodzę z dość nietypowym pytaniem. W jaki sposób mogę przekazać wartość zmiennej z jednego widgetu do drugiego?

W swoim projekcie utworzyłem mechanikę sklepu tj. Stworzyłem obiekt Actor (BP_Alice), który pełni rolę sprzedawcy i to w nim są tworzone wszystkie niezbędne „sklepowe” widgety. Po otwarciu sklepu jest tworzony widget WBP_Shop do którego jest dodawane tablica z WBP_ShopSlot (każdy slot zawiera inny indeks i reprezentuje inny przedmiot do kupienia). Po kliknięciu w interesujący nas slot(przedmiot) pojawia się WBP_ShopItemAmount, który odpowiada za ilość przedmiotu jaka nas interesuje. I w tym miejscu pojawia się problem.

Załóżmy, że chce kupić w sklepie 10x eliksir leczniczy. Otwieram sklep, klikam w slot eliksiru i wybieram 10 i kupuje. No i właśnie tutaj pojawia się problem z przesłaniem wartości zmiennej przechowującej ilość danego przedmiotu (struktura w WBP_ShopSlot) do WBP_ShopItemAmount (wyświetla 0). Podchodziłem do tego w różny sposób:

  1. Próbowałem tworzyć WBP_ShopItemAmount podczas kliknięcia w WBP_ShopSlot
  2. Próbowałem za pomocą funkcji GetActorOfAclass(BP_Alice)->WBP_ShopSlot->GetSItemStruct()->ItemQuantity
  3. Próbowałem wreszcie Event Dispatcherów; w WBP_ShopSlot utworzyłem Event Dispatcher, do którego podpiąłem prosty Event, który wyświetla ItemQuantity ze struktury i następnie wywołałem go poprzez referencje w WBP_ShopItemAmount

Niestety żadna z tych prób nie zadziałała, ale wydaje mi się, że mogłaby gdyby użył rzutowania. Niestety nie bardzo wiem co rzutować na co.

Zdaje sobie sprawę, że rozwiązanie problemu może być proste, ale niestety skończyły mi się pomysły. Gdyby ktoś mógł cokolwiek podpowiedzieć jak to ruszyć będę bardzo wdzięczny.

Pozdrawiam


#2

witam, proponowałbym inaczej podejść - jeżeli sklep jest tylko jeden (BP_Alice), a cała gra nie jest złożona z wielosklepowego systemu to itemy i i ilości trzymałbym w game instance i WBP tylko by pytało i wrzucało tam ilości. W game_instance miałbyś wtedy stan sklepu i stan gracza.
powodzenia


#3

Po pierwsze silnik… ale widzę że UE4/5 bo BP to pewnie blueprinty…

Generalnie obiekty mają stan i komunikują się ze sobą wywołując metody.

Tu masz jeszcze UI więc trochę bardziej namotene bedzie.

Ale generalnie powinien byc jakiś ShopContorller czy coś.

I jak klikniesz na ten item w shopie, to jakiś shopController dostanie wywołana metodę

shopController.Sell(itemId, amount)

i odpowiednio to rozpatrzy

a potem wyśle do UI info wywołując metodę SoldItem(itemId, amount)

Zwykle obiekty bierze rzeczy z którymi chce gadać - albo przy konstrukcji trzeba mu przekazać
Albo sobie sam szuka czegoś o odpowiednim opisie/typie tylko to jest wolniejsze i może znaleźć nie tę instancję co trzeba jak się nie pilnuje.

Można taki shop controler przyczepić do game instanc czy innej łatwo dostępnej klasy zeby go łatwo znaleźć jak ma być 1 w grze.

Najlepiej jak sterowanie idzie w miarę w jedna stronę. I zwykle lepiej żeby jakiś controller czy inne dość proste coś decydowało ile jest jakich itemów. I potem wysyłało to do UI.

Trzymanie stanu bezpośrednio w UI robi potem masę bugów jak coś będziesz animować itp


#4

Dziękuje za odpowiedzi. Napewno wezmę je sobie do serca przy kolejnym projekcie. W zasadzie kończę aktualny i została mi „tylko” poprawka błędów i muszę jakoś rozwiązać problemy, które sam sobie wygenerowałem. Generalnie udało mi się przesłać wartości wymaganych zmiennych z WBP_ShopSlot do WBP_ShopItemAmount za pomocą Eventu i działa to nienajgorzej. Niestety w drugą stronę tzn. przypisywanie zmiennej z WBP_ShopSlot wartości zmiennej z WBP_ShopItemAmount już nie działa. Co trochę dziwne moim zdaniem, ale jakoś muszę ten problem rozwiązać.