准备工作
UObject* Asset
UObject* Asset
通常指的是一个指向UObject
的指针。UObject
是Unreal Engine中的基类,几乎所有的引擎对象都继承自UObject
。这个指针可以引用任何派生自UObject
的对象,比如蓝图、材质、贴图、音频资源等资产。
如果你看到UObject* Asset
,它通常用于指向一个已加载或正在使用的引擎资产。你可以使用UObject*
来动态加载资产。例如,使用StaticLoadObject()
函数从文件路径加载一个资产。
UObject* Asset = StaticLoadObject(UObject::StaticClass(), nullptr, TEXT("/Game/MyAssetPath.MyAsset"));
Data Structure
TArray<FString> PrefixArray | Slow in look up(查找缓慢) |
TMap<UClass*,FString> PrefixMap | Fast in look up |
inside the map you will have two elements, one is the key, one is the value
and for the key, it is our UClass (material/texture/blueprint)
TMap<UClass*, FString> PrefixMap
类型映射(TMap
),它将一个键值对映射起来。
-
UClass*
是指向一个类对象的指针。UClass
示类的元类对象,通过UClass*
,可以引用 UE里的各种类类型, 如material,texture,blueprint。 -
FString
是一个字符串类型,存储文本数据,对应地如"M_" "T_" "BP_"。
build-in function
PrefixMap.Find(SelectedObject->GetClass())
includes and TPairs
#include "Materials/Material.h"
#include "Materials/MaterialInstanceConstant.h"
#include "Sound/SoundCue.h"
#include "Sound/SoundWave.h"
#include "Engine/Texture.h"
#include "Blueprint/UserWidget.h"
#include "Components/SkeletalMeshComponent.h"
#include "NiagaraSystem.h"
//#include "NiagaraEmitter.h"
{UBlueprint::StaticClass(),TEXT("BP_")},
{UStaticMesh::StaticClass(),TEXT("SM_")},
{UMaterial::StaticClass(), TEXT("M_")},
{UMaterialInstanceConstant::StaticClass(),TEXT("MI_")},
{UMaterialFunctionInterface::StaticClass(), TEXT("MF_")},
{USoundCue::StaticClass(), TEXT("SC_")},
{USoundWave::StaticClass(), TEXT("SW_")},
{UTexture::StaticClass(), TEXT("T_")},
{UTexture2D::StaticClass(), TEXT("T_")},
{UUserWidget::StaticClass(), TEXT("WBP_")},
{USkeletalMeshComponent::StaticClass(), TEXT("SK_")},
{UNiagaraSystem::StaticClass(), TEXT("NS_")},
//{UNiagaraEmitter::StaticClass(), TEXT("NE_")}
示例代码
quickAssetAction.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AssetActionUtility.h"#include "Materials/Material.h"
#include "Materials/MaterialInstanceConstant.h"
//#include "Particles/ParticleSystem.h"
#include "Sound/SoundCue.h"
#include "Sound/SoundWave.h"
#include "Engine/Texture.h"
#include "Blueprint/UserWidget.h"
#include "Components/SkeletalMeshComponent.h"
#include "NiagaraSystem.h"
//#include "NiagaraEmitter.h"
#include "QuickAssetAction.generated.h"//should be the last one, otherwise will have error/*** */
UCLASS()
class SUPERMANAGER_API UQuickAssetAction : public UAssetActionUtility
{GENERATED_BODY()public://UFUNCTION(CallInEditor)//void TestFuckingFunc();UFUNCTION(CallInEditor)void BatchDuplication(int32 NumOfDuplicates);UFUNCTION(CallInEditor)void AddPrefixes();private:TMap<UClass*, FString>PrefixMap ={{UBlueprint::StaticClass(),TEXT("BP_")},{UStaticMesh::StaticClass(),TEXT("SM_")},{UMaterial::StaticClass(), TEXT("M_")},{UMaterialInstanceConstant::StaticClass(),TEXT("MI_")},{UMaterialFunctionInterface::StaticClass(), TEXT("MF_")},//{UParticleSystem::StaticClass(), TEXT("PS_")},{USoundCue::StaticClass(), TEXT("SC_")},{USoundWave::StaticClass(), TEXT("SW_")},{UTexture::StaticClass(), TEXT("T_")},{UTexture2D::StaticClass(), TEXT("T_")},{UUserWidget::StaticClass(), TEXT("WBP_")},{USkeletalMeshComponent::StaticClass(), TEXT("SK_")},{UNiagaraSystem::StaticClass(), TEXT("NS_")},//{UNiagaraEmitter::StaticClass(), TEXT("NE_")}};};
quickAssetAction.cpp
void UQuickAssetAction::AddPrefixes()
{TArray<UObject*>SelectedObjects = UEditorUtilityLibrary::GetSelectedAssets();uint32 Counter = 0;for (UObject* SelectedObject : SelectedObjects){if (!SelectedObject) continue;//空指针检查 SelectedObject 是 nullptrFString* PrefixFound = PrefixMap.Find(SelectedObject->GetClass());//这一行查找 SelectedObject 对象对应的类(SelectedObject->GetClass())在 PrefixMap 中的值。// PrefixMap 是一个自己命名的TMap<UClass*, FString>键值对的映射,// 其中键是 UClass*(对象的类)如material,值是 FString(M_)。if (!PrefixFound || PrefixFound->IsEmpty()){Print(TEXT("Failed to find prefix for class ") + SelectedObject->GetClass()->GetName(), FColor::Red);continue;}FString OldName = SelectedObject->GetName();if (OldName.StartsWith(*PrefixFound)){Print(OldName + TEXT(" already has prefix added"), FColor::Red);continue;}const FString NewNameWithPrefix = *PrefixFound + OldName;UEditorUtilityLibrary::RenameAsset(SelectedObject, NewNameWithPrefix);++Counter;//将计数器 Counter 的值增加 1。它用于记录处理了多少个对象。//在脚本完成后,下面那串代码输出一条信息,例如 "成功处理了 X 个对象"。}if(Counter>0){ShowNotifyInfo(TEXT("Successfully renamed " + FString::FromInt(Counter) + " assets"));}
}
插件效果
优化补充:删除MI类型的默认前后缀
M_ xxxxx_Inst
示例代码
//如果类型是MI_old name里有M_和_Inst,移除他们。if (SelectedObject->IsA<UMaterialInstanceConstant>()){OldName.RemoveFromStart(TEXT("M_"));OldName.RemoveFromEnd(TEXT("_Inst"));}