首页 > 代码库 > 对《分享一下自己用c++写的小地图》一文的补充

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

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

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

 

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

重写SynchronizeProperties函数

头文件中添加:

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

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

cpp文件中添加:

#if WITH_EDITORvoid 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也都没有相关资料,不过这个问题不影响使用,所以教程到此为止了。

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