批量替换的逻辑很简单,找到所有的UI面板下的贴图资源,然后替换为同名的Sprite资源。主要是UE4的使用哪些API的问题,时间都花在查源码找API上。所以这里把代码贴出来。
void SWidgetUiTool::OnReplaceToSprite() { FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry"); const UClass* SpriteClass = UPaperSprite::StaticClass(); AssetRegistryModule.Get().GetAssetsByClass(SpriteClass->GetFName(), SpriteAssets); TArray<FAssetData> assetDatas; const UClass* BlueprintWidgetClass = UWidgetBlueprint::StaticClass(); AssetRegistryModule.Get().GetAssetsByClass(BlueprintWidgetClass->GetFName(), assetDatas); TArray<UPackage*> savePackages; bool isModify = false; for (int i = 0; i < assetDatas.Num(); i++) { UObject* widgetObject = assetDatas[i].GetAsset(); UWidgetBlueprint* widget = Cast<UWidgetBlueprint>(widgetObject); if (widget == NULL) continue; TArray<UWidget*> childs; widget->WidgetTree->GetAllWidgets(childs); isModify = false; for (int j = 0; j < childs.Num(); j++) { if (UImage * image = Cast<UImage>(childs[j])) { FSlateBrush brush = image->Brush; if (SetSpriteBrush(brush)) { image->SetBrush(brush); isModify = true; } } else if (UBorder * border = Cast<UBorder>(childs[j])) { FSlateBrush brush = border->Background; if (SetSpriteBrush(brush)) { border->SetBrush(brush); isModify = true; } } else if (UButton * button = Cast<UButton>(childs[j])) { FButtonStyle style = button->WidgetStyle; FSlateBrush normal = style.Normal; if (SetSpriteBrush(normal)) { style.SetNormal(normal); isModify = true; } FSlateBrush pressed = style.Pressed; if (SetSpriteBrush(pressed)) { style.SetPressed(pressed); isModify = true; } FSlateBrush hovered = style.Hovered; if (SetSpriteBrush(hovered)) { style.SetHovered(hovered); isModify = true; } FSlateBrush disabled = style.Disabled; if (SetSpriteBrush(disabled)) { style.SetDisabled(disabled); isModify = true; } button->SetStyle(style); } } if (isModify) { UPackage* Package = widget->GetOutermost(); savePackages.Add(Package); } } //保存修改 UEditorLoadingAndSavingUtils::SavePackages(savePackages, false); } bool SWidgetUiTool::SetSpriteBrush(FSlateBrush& brush) { auto resourceObj = brush.GetResourceObject(); if (resourceObj == NULL) return false; const FName originName = resourceObj->GetFName(); FAssetData findAssert = GetAssertByName(originName); if (findAssert == NULL) return false; brush.SetResourceObject(findAssert.GetAsset()); return true; } FAssetData SWidgetUiTool::GetAssertByName( const FName imageName) { FString resouceName = imageName.ToString()+ TEXT("_png"); for (int i = 0; i < SpriteAssets.Num(); i++) { if (SpriteAssets[i].AssetName.ToString().Equals(resouceName)) return SpriteAssets[i]; } return NULL; }