对《分享一下自己用c++写的小地图》一文的补充

时间:2023-01-09 21:18:59

在写完上一篇文章后,发现了一个问题:

那就是编写的插件无法实时预览。

 

在学习了Slate之后,我找到了方法:

重写SynchronizeProperties函数

头文件中添加:

#if WITH_EDITOR
UFUNCTION()
virtual void SynchronizeProperties() override;
#endif

因为只需要在编辑器中运行,所以加上了#if WITH_EDITOR

cpp文件中添加:

#if WITH_EDITOR
void UMiniMap::SynchronizeProperties()
{
Super::SynchronizeProperties();
WidgetSize
= 400;
MapTextureSize
= 512;
//构建组件
MainMap = NewObject<UImage>(this, TEXT("MainMap"));
PlayerCursor
= NewObject<UImage>(this, TEXT("PlayerCursor"));
Frame
= NewObject<UImage>(this, TEXT("Frame"));
//往Widget容器中加入组件
RootPanel = Cast<UCanvasPanel>(WidgetTree->RootWidget);
if (RootPanel)
{
RootPanel
->AddChild(MainMap);
RootPanel
->AddChild(PlayerCursor);
RootPanel
->AddChild(Frame);
}
UMaterialInstance
*MainMapMaterialInstance = LoadObject<UMaterialInstance>(NULL, TEXT("/Game/UI/Images/MiniMapMaterial_Instance"), NULL, LOAD_None, NULL);
if (MainMapMaterialInstance)
{
MainMapMaterial
= UKismetMaterialLibrary::CreateDynamicMaterialInstance(GetWorld(), MainMapMaterialInstance);
if (MainMapMaterial->Parent->GetMaterial()->MaterialDomain == MD_UI)
{
UWidgetLayoutLibrary::SlotAsCanvasSlot(MainMap)
->SetSize(FVector2D(WidgetSize, WidgetSize));
MainMap
->SetBrushFromMaterial(MainMapMaterial);
MainMapMaterial
->SetScalarParameterValue(FName(TEXT("MiniMapScaleRatio")), (float)WidgetSize / MapTextureSize);
}
}
UTexture2D
* PlayerCursorTexture = LoadObject<UTexture2D>(NULL, TEXT("/Game/UI/Images/PlayerCursor"), NULL, LOAD_None, NULL);
if (PlayerCursorTexture)
{
UWidgetLayoutLibrary::SlotAsCanvasSlot(PlayerCursor)
->SetSize(FVector2D(PlayerCursorTexture->GetSizeX(), PlayerCursorTexture->GetSizeY()));
PlayerCursorSize
= PlayerCursorTexture->GetSizeX();
UWidgetLayoutLibrary::SlotAsCanvasSlot(PlayerCursor)
->SetPosition(FVector2D(-PlayerCursorSize / 2 + WidgetSize / 2, -PlayerCursorSize / 2 + WidgetSize / 2));
PlayerCursor
->SetBrushFromTexture(PlayerCursorTexture);
}
if (SetImageBurshFromMaterial(TEXT("/Game/UI/Images/FrameMaterial"), Frame, FVector2D(WidgetSize, WidgetSize)))
{
UWidgetLayoutLibrary::SlotAsCanvasSlot(Frame)
->SetSize(FVector2D(WidgetSize, WidgetSize));
}
//后面可以考虑加入别的按钮以及边框
}
#endif

 

不过这样还有有一点小问题,在新建的蓝图(继承这个类的蓝图)中狂点,引擎会直接崩掉,目前找不到解决方案,引擎里都是用Slate的,论坛和AnswerHUB也都没有相关资料,不过这个问题不影响使用,所以教程到此为止了。