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

news2024/11/18 19:48:21

目录

 需要考虑的问题

重定向的修复函数

代码:

删除无引用资产

代码

需要添加的头文件和模块


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

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

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

 需要考虑的问题

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

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

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

重定向的修复函数

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

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

代码:

private:
	//修复重定向器
	void FixUpRedirectors();

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

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

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

继续加载模块。

最后进行修复。

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

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

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);
}

删除无引用资产

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

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

代码

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);
	}
}

需要添加的头文件和模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1065041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt的WebEngineView加载网页时出现Error: WebGL is not supported

1.背景 当我在qml中使用WebEngineView加载一个网页时&#xff0c;出现以下错误&#xff1a; Error: WebGL is not supported 2.解决方案 其实这个问题在Qt的帮助文档中已经提及了解决办法&#xff1a; 因此&#xff0c;可以按照下面的步骤操作一下&#xff1a; 2.1.pro文件 …

win10、win11彻底永久关闭自动更新的方法

win10、win11彻底永久关闭自动更新的方法 前言彻底关闭自动更新方法步骤一、禁用Windows Update服务二、在组策略里关闭Win10自动更新相关服务四、在注册表中关闭Win10自动更新 完结 前言 win系统的自动更新可谓是非常顽固&#xff0c;很多用户在网上试了各种关闭win系统自动更…

【DevExpress基础一】之MapControl的基础用法(含demo和png瓦片地图下载地址)

结果预览 定义一个自定义控件 需要定义以下几个变量: MapControl,地图控件变量ImageLayer,地图切片数据层VectorItemsLayer,地图矢量图层MapItemStorage,矢量图层的Storage// 添加 MapControl 控件 public MapControl map = new MapControl(

二叉树的经典OJ题

对称二叉树 1.题目2.图形分析3.代码实现 1.题目 2.图形分析 3.代码实现 class Solution {public boolean isSymmetric(TreeNode root) {if(root null){return true;}return isSymmetricchild(root.left,root.right);}private boolean isSymmetricchild(TreeNode leftTree,Tre…

洛谷刷题:数组

好累&#xff0c;学习令我快乐 一、小鱼比可爱 题目链接&#xff1a;https://www.luogu.com.cn/problem/P1428 题目描述 人比人&#xff0c;气死人&#xff1b;鱼比鱼&#xff0c;难死鱼。小鱼最近参加了一个“比可爱”比赛&#xff0c;比的是每只鱼的可爱程度。参赛的鱼被从…

System vulnerabilities and common attack methods

《米特尼克自传》难以置信的&#xff0c;大开眼界的个人真实故事哈哈哈哈 链接&#xff1a;https://pan.baidu.com/s/1FNCpjRDHgKfCdLHQ6mQfuQ?pwdw24y 提取码&#xff1a;w24y A system vulnerability is a weakness in the design, implementation, or configuration of a …

【微信小程序开发】宠物预约医疗项目实战-登录实现

【微信小程序开发】宠物预约医疗项目实战-登录实现 第二章 宠物预约医疗项目实战-注册实现 文章目录 【微信小程序开发】宠物预约医疗项目实战-登录实现前言一、打开项目文件二、编写代码2.1 wxss代码编写2.2 wxml代码编写2.3 js代码编写2.3.1 登录接口获取&#xff1a; 2.4 j…

FPGA project : fifo_sum

实验目标&#xff1a; col(列) 4 &#xff1b;line(行) 5。相邻三行&#xff0c;按列求和。输出新的数据流。 实现方法&#xff1a; 通过rs232通信协议&#xff0c;输入数据流。第一行存进fifo1&#xff0c;第二行存进fifo2.当输入第三行第一个数据的时候&#xff0c;从fif…

RHCE---作业2

文章目录 目录 文章目录 一.远程连接服务器 二.基于域名和虚目录建立网站 一.远程连接服务器 配置 ssh 免密登陆&#xff1a;客户端主机通过 redhat 用户基于秘钥验证方式进行远程连接服务器的 root 用户 #服务端关闭防火墙 [roottimeserver ~]# systemctl disable --now fir…

一文掌握Linux系统信息查看命令(CPU、内存、进程、网口、磁盘、硬件)

引言 大家好&#xff0c;欢迎来到我的技术博客&#xff01;如果你是一名Linux系统管理员、开发者或者热衷于学习Linux系统的用户&#xff0c;那么你一定需要掌握查看系统信息的命令。在这篇博客中&#xff0c;我将为你介绍一些常用的Linux命令&#xff0c;帮助你快速了解和监控…

2023年CSP-J真题详解+分析数据(选择题篇)

目录 前言 2023CSP-J江苏卷详解 小结 前言 下面由我来给大家讲解一下CSP-J的选择题部分。 2023CSP-J江苏卷详解 1.答案 A 解析&#xff1a;const在C中是常量的意思&#xff0c;其作用是声明一个变量&#xff0c;值从头至尾不能被修改 2.答案 D 解析&#xff1a;八进制…

前端TypeScript学习day01-TS介绍与TS部分常用类型

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 TypeScript 介绍 TypeScript 是什么 TypeScript 为什么要为 JS 添加类型支持&#xff1f; TypeScript 相…

vertx的学习总结4之异步数据和事件流

一、异步数据和事件流 1.为什么流是事件之上的一个有用的抽象&#xff1f; 2.什么是背压&#xff0c;为什么它是异步生产者和消费者的基础&#xff1f; 3.如何从流解析协议数据&#xff1f; 1. 答&#xff1a;因为它能够将连续的事件序列化并按照顺序进行处理。通过将事件…

Elasticsearch架构原理快速了解

目录 一、ES的简单了解 &#xff08;一&#xff09;直面Elasticsearch &#xff08;二&#xff09;Elasticsearch和关系型数据库的对比 二、基本概念回顾 &#xff08;一&#xff09;索引、文档、字段的概念 &#xff08;二&#xff09;映射 &#xff08;三&#xff09;…

读取图片颜色占比绘制{精美}折线图失败

问题之初 读取图片颜色占比绘制{精美}折线图失败❌ 花了4个小时 你问我问题吧 选择题<small> 读取一张图片各种颜色占比 默认 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg自动设置检测代码需要的库 函数 变量 定义 样式等from PIL impor…

C++库函数——set与map的模拟实现

目录 1.红黑树的迭代器与改造 ①红黑树的迭代器 ②红黑树的改造 2.map的模拟实现 3.set的模拟实现 4.测试 1.红黑树的迭代器与改造 ①红黑树的迭代器 对于上面这棵红黑树&#xff0c;我们可以很容易得知道begin()是红黑树的最左节点&#xff0c;end()应该是一个空节点。…

ubuntu增加内存

文章目录 1、硬盘操作步骤第二步:点击【扩展】(必须关闭ubuntu电源才能修改)第三步:修改【最大磁盘容量大小】1、硬盘操作步骤 最近发现Ubuntu空间不足,怎么去扩容呢? 第一步:点击【硬盘】 第二步:点击【扩展】(必须关闭ubuntu电源才能修改) 第三步:修改【最大磁…

Java反序列化:CC1链 详解

CC1 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库&#xff0c;它提供了很多强大的数据结构类型和实现了各种集合工具类。作为Apache开放项目的重要组件&#xff0c;Commons Collections被广泛的各种Java应用的开发&#xff0c;⽽正 是因…

腾讯云轻量和CVM有啥区别?怎么选择服务器配置?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

MIPI接口协议及规范理解

什么是MIPI接口 MIPI&#xff0c;英文全称为Mobile Industry Processor Interface&#xff0c;即移动行业处理器接口。它是MIPI联盟发起的为移动应用处理器制定的开放标准。MIPI接口是一种专为移动设备和嵌入式系统设计的串行通信接口&#xff0c;定义了一系列的接口标准&…