zoukankan      html  css  js  c++  java
  • 对《分享一下自己用c++写的小地图》一文的补充

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

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

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

  • 相关阅读:
    zookeeper简介
    LRU和LFU的区别和使用场景
    windows环境搭建Webpack5 + Vue3项目实践
    Javascript 导出文件(post、get请求)
    解决Nginx出现403 forbidden (13: Permission denied)报错的四种方法
    2021 ASP.NET Core 开发者路线图
    华为云云原生王者之路钻石集训营--学习笔记
    Kubernetes全栈架构师(资源调度上)--学习笔记
    Kubernetes全栈架构师(基本概念)--学习笔记
    Kubernetes全栈架构师(Docker基础)--学习笔记
  • 原文地址:https://www.cnblogs.com/blueroses/p/5813521.html
Copyright © 2011-2022 走看看