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

  • 相关阅读:
    leetcode 105. 从前序与中序遍历序列构造二叉树
    leetcode 96. 不同的二叉搜索树
    leetcode 21. 合并两个有序链表
    leetcode 617. 合并二叉树
    leetcode 101. 对称二叉树
    欧拉定理和扩展欧拉定理。
    [NOI2018] 屠龙勇士
    [SDOI2010]古代猪文
    [SDOI2013]方程
    扩展Lucas定理
  • 原文地址:https://www.cnblogs.com/blueroses/p/5813521.html
Copyright © 2011-2022 走看看