首页 > 代码库 > 对《分享一下自己用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++写的小地图》一文的补充
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。