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 предмет у меня и правый угол заезжает на ячейку инвентаря и если она пустая, то виджет ячейки на заднем фоне этого драга должен менять цвет на зеленый, если ячейка занята, то на красный и вот в чем проблема, я совершенно не понимаю как мне отслеживать эти моменты? я нашел там параметр геометрии в виджете, я так понимаю эта геометрия записывается во вьюпорте, только вот как с этим работать я пока не разобрался, пытался почитать на сайте уе, но пока честно сказать ничего не понял.