UE5.1编辑器拓展【三、脚本化资产行为,删除无引用资产】

目录

需要考虑的问题

重定向的修复函数

代码:

删除无引用资产

代码

需要添加的头文件和模块


在我们删除资产的时候,会发现,有些资产在删除的时候会出现有被什么什么引用,还有的是没有被引用。

而我们如果直接选择一片去进行删除的话,那么会导致看到很多有引用和没有引用的出现。

现在我们需要将没有引用的全部删除,而有引用的全部留下,做一个脚本化资产行为

需要考虑的问题

1.首先我们会选择一堆资产,如何从资产中,找到没有被引用的资产,然后进行删除。

2.我们要考虑到假如资产迁移后没有修复重定向的情况,所以要在删除无引用资产前需要对重定向器进行全局的一个修复。

3.模块问题,我们修复重定向器的时候,肯定会访问各种各样不同的模块,而对此我们需要进行一个添加。

重定向的修复函数

首先我们做一个函数,这个函数的作用就是在删除资产之前对全局 进行一个重定向器的修复 ,以防止不小心删除了没有修复重定向器的有引用资产

所以这个函数我决定放在private里面使用。

代码:

cpp 复制代码
private:
	//修复重定向器
	void FixUpRedirectors();

首先是加载AssetRegistry模块,然后创建一个过滤器,并对其中进行设置。

之后将通过这个遍历器的资产放入数组中去,再继续遍历,然后再继续获取指定过滤条件的资产信息。

将其中加入到需要修复的数组中去。

继续加载模块。

最后进行修复。

FAssetRegistryModule 模块:AssetRegistry模块用于管理项目中的资产信息,包括资产的元数据、引用关系、依赖关系等。它的主要作用是提供对项目中的资产进行查询和操作的接口。

FAssetToolsModule 模块:AssetTools模块用于执行与资产操作相关的功能,如创建、删除、重命名等。它提供了一系列的方法来管理项目中的资产。

cpp 复制代码
void UQuicklyAssetAction::FixUpRedirectors()
{
	TArray<UObjectRedirector*> RedirectorsToFixArray;
	//加载AssetRegistry模块
	FAssetRegistryModule& AssetRegistryModule =FModuleManager::Get().LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
	//创建过滤器
	FARFilter Filter;
	Filter.bRecursivePaths = true;//遍历子文件
	Filter.PackagePaths.Emplace("/Game");//遍历 "/Game" 目录下的文件
	Filter.ClassNames.Emplace("ObjectRedirector");//类名为 "ObjectRedirector" 的文件
	//获取满足条件的文件到OutRedirectors中
	TArray<FAssetData> OutRedirectors;
	AssetRegistryModule.Get().GetAssets(Filter, OutRedirectors);
	//将满足条件的文件添加到 RedirectorsToFixArray 数组中
	for (const FAssetData& RedirectorData:OutRedirectors)
	{
		if (UObjectRedirector* RedirectorToFix=Cast<UObjectRedirector>(RedirectorData.GetAsset()))
		{
			RedirectorsToFixArray.Add(RedirectorToFix);
		}
	}
	//加载 AssetTools 模块
	FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
	//修复重定向器
	AssetToolsModule.Get().FixupReferencers(RedirectorsToFixArray);
}

删除无引用资产

在完成了修复重定向的函数后,我们来进行真正的无引用资产的删除函数制作:

其实其中的方法很简单,主要的功能和前面两章大差不差,只不过添加了对资产重定向的修复。

代码

cpp 复制代码
void UQuicklyAssetAction::RemoveNoRefAsset()
{
	TArray<FAssetData> SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();
	TArray<FAssetData> NoRefAssetData;
	//修复重定向器
	FixUpRedirectors();
	for (const FAssetData& SelectedAssetDate:SelectedAssetsData)
	{
		//输入资产的路径,获取对资产的引用,保存在数组里面
		TArray<FString> AssetRefs = UEditorAssetLibrary::FindPackageReferencersForAsset(SelectedAssetDate.ObjectPath.ToString());
		//AssetRefs的数量为0,则表示没有引用,添加到要删除的数组里面,之后统一进行删除
		if (AssetRefs.Num()==0)
		{
			NoRefAssetData.Add(SelectedAssetDate);
		}
	}
	//判断未引用的资产数量是否为0
	if (NoRefAssetData.Num()==0)
	{
		ShowMsgDialog(EAppMsgType::Ok, "No asset with a 0 reference was found among the selected assets.", false);
		return;
	}
	//#include "ObjectTools.h"添加头文件,删除资产
	const int32 DeleteAssetNum= ObjectTools::DeleteAssets(NoRefAssetData);
	if (DeleteAssetNum>0)
	{
		ShowNotifyInfo("Description The asset referenced by 0 is deleted successfully. A total of" + FString::FromInt(DeleteAssetNum) + "files are deleted.", 7);
	}
}

需要添加的头文件和模块

相关推荐
qq_205279056 分钟前
Unity 运行时候会时不时卡顿一下,哪怕是空场景
unity·游戏引擎
王老师青少年编程25 分钟前
信奥赛C++提高组csp-s之FHQ Treap
c++·csp·平衡树·信奥赛·csp-s·提高组·fhq treap
木古古181 小时前
搞一个高效的c/c++开发环境,工具VIm+自研vim插件+Shell脚本
linux·编辑器·vim
QiLinkOS2 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
knighthood20012 小时前
vscode插件开发的一些过程
ide·vscode·编辑器
Irissgwe2 小时前
c++STL--string类
c++·stl·string
Irissgwe3 小时前
c++类型转换
c++·类型转换·explicit·static_cast·const_cast·dynamic_cast·rtti
智者知已应修善业3 小时前
【51单片机用T0定时器方式1,实现0.5S的时间间隔实现第一次一个灯亮、第二次二个灯亮,直到全部灯亮,然后重复整个过程】2023-12-29
c++·经验分享·笔记·算法·51单片机
智者知已应修善业3 小时前
【51单片机4位静态数码管显示1234】2023-11-14
c++·经验分享·笔记·算法·51单片机
抓虾爪3 小时前
ST意法代理商粤科源兴丨LSM6DS3全系列现货库存,LSM6DS3TR-C当天可发
c++