Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 27
Здравствуйте товарищи, дело такое, я небольшую рпг решил своять, а в любой рпг игре как известно есть лут. С самим лутом у меня проблем вроде нету, запилил свой класс для вещей ан основе AActor, прикрепил туда статикмеш, дропается, берется, мышкой наводишь подсвечивается. Хотелось бы еще добавить и текст с названием при наведении, по типу как в Дъябло, что бы строка, с бэкграундом. Подскажите пожалуйста варианты реализации, я честно сказать с UE4 только начал знакомиться и пока все что мне пришло в голову это приатачить к этому самому мешу виджет. Хотелось бы услышать экспертное мнение по этому поводу, стоит ли так делать вообще и какие есть альтернативы. И еще хотелось бы узнать как эти виджеты кодить?
Аватара пользователя
Пользователь
Сообщения: 27
Изображение
я вообщем добавил виджет к актору и вот что получилось, одни виджеты перекрывают другие в то время кук в Дьябло скажем или в паф оф эекзайл все эти названия компонуется рядом друг с другом Изображение

вот по поводу подобной реализации вопрос, это мне получается надо спаунить виджет не на предмете а на точке рядом с предметом, потом значиит как то проверять не перекрывает ли он другой виджет и двигать их? я не очень понимаю какие инструменты для этого использовать, есть какие нибудь идеи?
Аватара пользователя
Пользователь
Сообщения: 27
и как сделать поправку на угол обзора?
можно ли вообще выводить виджеты на экране? так что бы их положение основывалось на объектах из мира которые попадают в обзор камеры?
Аватара пользователя
Пользователь
Сообщения: 27
И еще один вопрос по поводу подсветки предметов, как вы знаете обычно есть кнопка которая включает / отключает подсветку предметов
и тут я подумал а как же мне это реализовать? Если я отправлю вообще всем объектам класса предмет экзекьют через актор инетатор, это же неправильный подход? Не работает так если объектов в мире много? Вот и хотелось бы узнать, как мне повесить экзекьют на каждый объект который рендерится по ходу отправлять и как мне вообще узнать какие объекты в обзоре камеры на данный момент находятся?
Аватара пользователя
Пользователь
Сообщения: 2319
вобще поиск свободного места виджета во вьювпорте для отображения, чтоб виджеты не накладывались или пересекались - это хороший вопрос , ответ мне тоже был бы интересен...
и если кого найдется какая инфа по этому было б хорошо чет почитать. потому что я себе представляю слишком сложную конструкцию с расчетом 2д физики, должен быть способ проще по идее.

по поводу обзора камеры, проще всего создать компонент, который будет проверять-мерять владельца, доступ к камере есть, параметры камеры известны и математика елементарная.
в итоге получаем булевую из такого компонента: в обзоре камеры обьект или нет, и по ней что надо вызываем уже в самом обьекте. другого простого способа пока не нашел.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 27
Snake писал(а):
вобще поиск свободного места виджета во вьювпорте для отображения, чтоб виджеты не накладывались или пересекались - это хороший вопрос , ответ мне тоже был бы интересен...
и если кого найдется какая инфа по этому было б хорошо чет почитать. потому что я себе представляю слишком сложную конструкцию с расчетом 2д физики, должен быть способ проще по идее.

по поводу обзора камеры, проще всего создать компонент, который будет проверять-мерять владельца, доступ к камере есть, параметры камеры известны и математика елементарная.
в итоге получаем булевую из такого компонента: в обзоре камеры обьект или нет, и по ней что надо вызываем уже в самом обьекте. другого простого способа пока не нашел.


Да я уже разобрался с камерами, там есть такая фишка итератор всех акторов в мире, а уже в акторе есть булька которая говорит видно актор или нет, а вот с поиск свободного места во въюпорте я так и не решил вопрос, но я так сказать и не заморчивался пока, столкнулся с другим сейчас по теме моментом, делаю драг н дроп инвентарь как в дъябле и столкнулся с проблемой вот есть у меня драг энд дроп виджет короче.

Вот он собственно

Код:
#include "Image.h"
#include "Base.h"
#include "ItemIcon.generated.h"

UCLASS()
class SARAFAN_API UItemIcon : public UUserWidget
{GENERATED_BODY()


public:

   virtual void NativeConstruct() override;
   virtual TSharedRef<SWidget> RebuildWidget();

   // Variables

protected:

   UTexture2D* Image;
   UImage* ItemIcon;
   TMap<FVector2D, UImage*> IconSlots;
   TMap <FVector2D, ELights> IconLight;
   
   TArray<FLinearColor> LightArray =
   {
         { 0.0f, 0.0f, 0.0f, 0.0f },
         { 0.0f, 1.0f, 0.0f, 0.33f },
         { 1.0f, 1.0f, 0.0f, 0.33f },
         { 1.0f, 1.0f, 0.0f, 0.33f }
   };

   int SlotsX;
   int SlotsY;

// Functions

public:
   
   void SetItemSizeAndImage(int sizex, int sizey, UTexture2D *image);
   

};


Код:


#include "ItemIcon.h"
#include "Base.h"

void UItemIcon::NativeConstruct()
{

   Super::NativeConstruct();

}

TSharedRef<SWidget> UItemIcon::RebuildWidget()
{
   UPanelWidget* RootWidget = Cast<UPanelWidget>(GetRootWidget());

   if (!RootWidget)
   {
      RootWidget = WidgetTree->ConstructWidget<UCanvasPanel>(UCanvasPanel::StaticClass(), (TEXT("Root")));
      UCanvasPanelSlot *RootWidgetSlot = Cast<UCanvasPanelSlot>(RootWidget->Slot);
      WidgetTree->RootWidget = RootWidget;
      RootWidget->SetVisibility(ESlateVisibility::HitTestInvisible);
   }

   TSharedRef<SWidget>   Widget = Super::RebuildWidget();

   if (RootWidget && WidgetTree)
   {
      ItemIcon = WidgetTree->ConstructWidget<UImage>(UImage::StaticClass(), (TEXT("Item Icon")));;
      RootWidget->AddChild(ItemIcon);
      UCanvasPanelSlot *ItemIconSlot = Cast<UCanvasPanelSlot>(ItemIcon->Slot);
      if (Image)
      {
         ItemIcon->SetBrushFromTexture(Image);
      }
      ItemIconSlot->SetSize(FVector2D(slotsize * SlotsX, slotsize * SlotsY));
      ItemIconSlot->SetZOrder(1);
      
      for (int y = 0; y < SlotsY; y++)
      {
         for (int x = 0; x < SlotsX; x++)
         {

            IconSlots.Add(FVector2D(x, y), WidgetTree->ConstructWidget<UImage>(UImage::StaticClass(), (TEXT("Icon Slot"))));
            UImage* IconSlot = IconSlots[FVector2D(x, y)];
            IconSlot->SetColorAndOpacity(FLinearColor(0.f, 0.f, 0.f, 0.3f));
            RootWidget->AddChild(IconSlot);
            UCanvasPanelSlot *IconSlotSlot = Cast<UCanvasPanelSlot>(IconSlot->Slot);
            IconSlotSlot->SetSize(FVector2D(slotsize, slotsize));
            IconSlotSlot->SetPosition(FVector2D(x * slotsize, y * slotsize));
            IconSlotSlot->SetZOrder(0);
         }
      }

   }
   return Widget;
}

void UItemIcon::SetItemSizeAndImage(int sizex, int sizey, UTexture2D *image)
{
   SlotsX = sizex;
   SlotsY = sizey;
   Image = image;
   RebuildWidget();



это простенький виджет, я его собственно говоря создаю когда предмет поднимается, разрушаю когда предмет выкидывается, а с момента как он создан через фрейм тик я его перемещаю к координатам курсора, в теории у меня есть картинка на первом плане это картинка предмета, ячейки на заднем которые создаются и должны менять свет когда попадают на ячейки инвентаря, то есть скажем 2x6 предмет у меня и правый угол заезжает на ячейку инвентаря и если она пустая, то виджет ячейки на заднем фоне этого драга должен менять цвет на зеленый, если ячейка занята, то на красный и вот в чем проблема, я совершенно не понимаю как мне отслеживать эти моменты? я нашел там параметр геометрии в виджете, я так понимаю эта геометрия записывается во вьюпорте, только вот как с этим работать я пока не разобрался, пытался почитать на сайте уе, но пока честно сказать ничего не понял.


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница