判断一个Package是否是重定向器
最近在做一个构建需求的时候,需要处理重定向器的问题
一开始用UEditorAssetLibrary::LoadAsset加载出来判断,但是无法处理umap
之后改用AssetRegistry扫出来判断类型,效率也还行,在此做一下记录
构造出一个umap的重定向器来实验
C++实现
boolUBlueprintFunctionLibraryExtend::IsPackageRedirector(constFString&PackageName){FAssetRegistryModule&AssetRegistryModule=FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");IAssetRegistry&AssetRegistry=AssetRegistryModule.Get();FString PackagePath=FPaths::GetPath(PackageName);FString AssetName=FPaths::GetBaseFilename(PackageName);TArray<FAssetData>AssetDatas;AssetRegistry.GetAssetsByPath(FName(*PackagePath),AssetDatas,false);for(constFAssetData&AssetData:AssetDatas){if(AssetData.AssetName.ToString()==AssetName){returnAssetData.AssetClass==FName(TEXT("ObjectRedirector"));}}UE_LOG(LogTemp,Error,TEXT("[Error] Can't find asset data for `%s`."),*PackageName);returnfalse;}Python实现
importosimportunreal asset_registry=Nonedefis_package_redirector(package_name)->bool:""" 判断一个Package Name指向的资产是否是重定向器 Args: package_name (str): 资产Package名 Returns: bool: package_name指向的资产是否是重定向器 """globalasset_registryifasset_registryisNone:asset_registry=unreal.AssetRegistryHelpers.get_asset_registry()asset_name=os.path.basename(package_name)forasset_datainasset_registry.get_assets_by_path(os.path.dirname(package_name),recursive=False):asset_data:unreal.AssetDataifasset_data.asset_name==asset_name:returnasset_data.asset_class=="ObjectRedirector"unreal.log_error(f"[Error] Can`t find asset data for `{package_name}`.")returnFalse