bluerose 发表于 2016-8-27 18:21:29

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

本帖最后由 bluerose 于 2016-8-27 18:26 编辑

在写完上一篇文章后,发现了一个问题:那就是编写的插件无法实时预览。
在学习了Slate之后,我找到了方法:重写SynchronizeProperties函数头文件中添加:#if WITH_EDITOR
      UFUNCTION()
      virtual void SynchronizeProperties() override;
#endif因为只需要在编辑器中运行,所以加上了#if WITH_EDITORcpp文件中添加:
#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也都没有相关资料,不过这个问题不影响使用,所以教程到此为止了。

963220333 发表于 2016-8-30 21:21:21

感谢楼主!!!!!!!

nameless123456 发表于 2016-8-31 11:25:01

谢谢分享,好像非常不错呢~~

crackertoo 发表于 2016-8-31 11:27:45

http://www.unrealchina.com/?fromuid=6887 小地图 用这种方式 也是醉了~

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的开发,还好有这学习资料留下来能够一看
页: [1]
查看完整版本: 对《分享一下自己用c++写的小地图》一文的补充