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

[复制链接]
查看4847 | 回复9 | 2016-8-27 18:21:29 | 显示全部楼层 |阅读模式
本帖最后由 bluerose 于 2016-8-27 18:26 编辑

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

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


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

重写SynchronizeProperties函数

头文件中添加:

[mw_shl_code=cpp,true]#if WITH_EDITOR
        UFUNCTION()
        virtual void SynchronizeProperties() override;
#endif[/mw_shl_code]

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

cpp文件中添加:

[mw_shl_code=cpp,true]
#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[/mw_shl_code]

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


963220333 | 2016-8-30 21:21:21 | 显示全部楼层
感谢楼主!!!!!!!
回复

使用道具 举报

nameless123456 | 2016-8-31 11:25:01 | 显示全部楼层
谢谢分享,好像非常不错呢~~
回复 支持 反对

使用道具 举报

crackertoo | 2016-8-31 11:27:45 | 显示全部楼层
小地图 用这种方式 也是醉了~
回复 支持 反对

使用道具 举报

supervdreamer | 2016-8-31 22:00:47 | 显示全部楼层
谢谢分享,非常有用
回复 支持 反对

使用道具 举报

rello | 2016-9-14 16:16:34 | 显示全部楼层
支持一下
回复

使用道具 举报

xufeng_po | 2016-10-17 09:20:10 | 显示全部楼层
感谢分享。
回复

使用道具 举报

caolin7 | 2016-11-3 09:57:52 | 显示全部楼层
能给一下工程文件吗?
回复 支持 反对

使用道具 举报

ajhonson4 | 2016-12-30 21:41:58 | 显示全部楼层
路过,看一看。
回复 支持 反对

使用道具 举报

我会为何弃疗 | 2019-6-6 10:21:46 | 显示全部楼层
tql,2016年,就已经在做slate的开发,还好有这学习资料留下来能够一看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

4

主题

23

回帖

182

积分

初阶编码师

积分
182