目錄
?需要考慮的問題
重定向的修復(fù)函數(shù)
代碼:
刪除無引用資產(chǎn)
代碼
需要添加的頭文件和模塊
在我們刪除資產(chǎn)的時(shí)候,會(huì)發(fā)現(xiàn),有些資產(chǎn)在刪除的時(shí)候會(huì)出現(xiàn)有被什么什么引用,還有的是沒有被引用。
而我們?nèi)绻苯舆x擇一片去進(jìn)行刪除的話,那么會(huì)導(dǎo)致看到很多有引用和沒有引用的出現(xiàn)。
現(xiàn)在我們需要將沒有引用的全部刪除,而有引用的全部留下,做一個(gè)腳本化資產(chǎn)行為。
?需要考慮的問題
1.首先我們會(huì)選擇一堆資產(chǎn),如何從資產(chǎn)中,找到?jīng)]有被引用的資產(chǎn),然后進(jìn)行刪除。
2.我們要考慮到假如資產(chǎn)遷移后沒有修復(fù)重定向的情況,所以要在刪除無引用資產(chǎn)前需要對(duì)重定向器進(jìn)行全局的一個(gè)修復(fù)。
3.模塊問題,我們修復(fù)重定向器的時(shí)候,肯定會(huì)訪問各種各樣不同的模塊,而對(duì)此我們需要進(jìn)行一個(gè)添加。
重定向的修復(fù)函數(shù)
首先我們做一個(gè)函數(shù),這個(gè)函數(shù)的作用就是在刪除資產(chǎn)之前對(duì)全局進(jìn)行一個(gè)重定向器的修復(fù),以防止不小心刪除了沒有修復(fù)重定向器的有引用資產(chǎn)。
所以這個(gè)函數(shù)我決定放在private里面使用。
代碼:
private:
//修復(fù)重定向器
void FixUpRedirectors();
首先是加載AssetRegistry模塊,然后創(chuàng)建一個(gè)過濾器,并對(duì)其中進(jìn)行設(shè)置。
之后將通過這個(gè)遍歷器的資產(chǎn)放入數(shù)組中去,再繼續(xù)遍歷,然后再繼續(xù)獲取指定過濾條件的資產(chǎn)信息。
將其中加入到需要修復(fù)的數(shù)組中去。
繼續(xù)加載模塊。
最后進(jìn)行修復(fù)。
FAssetRegistryModule模塊:AssetRegistry模塊用于管理項(xiàng)目中的資產(chǎn)信息,包括資產(chǎn)的元數(shù)據(jù)、引用關(guān)系、依賴關(guān)系等。它的主要作用是提供對(duì)項(xiàng)目中的資產(chǎn)進(jìn)行查詢和操作的接口。
FAssetToolsModule模塊:AssetTools模塊用于執(zhí)行與資產(chǎn)操作相關(guān)的功能,如創(chuàng)建、刪除、重命名等。它提供了一系列的方法來管理項(xiàng)目中的資產(chǎn)。
void UQuicklyAssetAction::FixUpRedirectors()
{
TArray<UObjectRedirector*> RedirectorsToFixArray;
//加載AssetRegistry模塊
FAssetRegistryModule& AssetRegistryModule =FModuleManager::Get().LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
//創(chuàng)建過濾器
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 數(shù)組中
for (const FAssetData& RedirectorData:OutRedirectors)
{
if (UObjectRedirector* RedirectorToFix=Cast<UObjectRedirector>(RedirectorData.GetAsset()))
{
RedirectorsToFixArray.Add(RedirectorToFix);
}
}
//加載 AssetTools 模塊
FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
//修復(fù)重定向器
AssetToolsModule.Get().FixupReferencers(RedirectorsToFixArray);
}
刪除無引用資產(chǎn)
在完成了修復(fù)重定向的函數(shù)后,我們來進(jìn)行真正的無引用資產(chǎn)的刪除函數(shù)制作:
其實(shí)其中的方法很簡單,主要的功能和前面兩章大差不差,只不過添加了對(duì)資產(chǎn)重定向的修復(fù)。
代碼
void UQuicklyAssetAction::RemoveNoRefAsset()
{
TArray<FAssetData> SelectedAssetsData = UEditorUtilityLibrary::GetSelectedAssetData();
TArray<FAssetData> NoRefAssetData;
//修復(fù)重定向器
FixUpRedirectors();
for (const FAssetData& SelectedAssetDate:SelectedAssetsData)
{
//輸入資產(chǎn)的路徑,獲取對(duì)資產(chǎn)的引用,保存在數(shù)組里面
TArray<FString> AssetRefs = UEditorAssetLibrary::FindPackageReferencersForAsset(SelectedAssetDate.ObjectPath.ToString());
//AssetRefs的數(shù)量為0,則表示沒有引用,添加到要?jiǎng)h除的數(shù)組里面,之后統(tǒng)一進(jìn)行刪除
if (AssetRefs.Num()==0)
{
NoRefAssetData.Add(SelectedAssetDate);
}
}
//判斷未引用的資產(chǎn)數(shù)量是否為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"添加頭文件,刪除資產(chǎn)
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.zghlxwxcb.cn/news/detail-727749.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-727749.html
到了這里,關(guān)于UE5.1編輯器拓展【三、腳本化資產(chǎn)行為,刪除無引用資產(chǎn)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!