Addressables资源管理总目录
0.窗口位置
打开的窗口
1.Fixable Rules 可修复的规则
1.1 Check Duplicate Bundle Dependencies 检查重复的Bundle依赖项
此规则通过扫描所有使用BundledAssetGroupSchemas的组,
并投影asset组布局来检查可能冗余的asset。
这实际上会触发一个完整的构建,所以这个检查是非常耗时和耗费性能的。
问题:冗余的asset是由于不同组中的asset共享依赖关系,例如,两个Prefabs 共享存在于不同Addressable Group中的一个 material 。这些material (以及它的任何依赖)都会被分成两个组,每组都有Prefabs 。为了防止这种情况发生,必须将material 标记为Addressable,或者放在其中一个Prefabs中,或者放在它自己的空间中,从而将该material 及其依赖项归在一个单独的Addressable Group中。
解决方法:如果此检查发现任何问题,则对此规则运行修复操作会创建一个新的可寻址组,以在其中移动所有依赖资产。
2.Unfixable rules 不可修复的规则
2.1 Check Resources to Addressable Duplicate Dependencies 检查资源是否可寻址重复依赖项
此规则检测在构建的Addressable 数据和驻留在Resources文件夹中的assets 之间是否存在任何assets 或assets 依赖项冗余。
问题:这些冗余意味着数据将同时包含在应用程序构建和Addressable构建中。
解决方案:这条规则是不可修复的,因为不存在适当的操作。这是纯粹的信息,提醒你注意冗余。如果分析出了的话,你必须手动解决。一个可能的手动修复示例是将违规assets 移出Resources文件夹,并使其变为Addressable。
2.2 Check Scene to Addressable Duplicate Dependencies 将场景检查为可寻址的重复依赖项
此规则检测编辑器场景列表中的场景和Addressable中的场景之间共享的任何assets或assets依赖项。
问题:这些冗余意味着数据将同时包含在应用程序构建和Addressable构建中。
解决方案:这纯粹是信息,提醒您注意冗余。如果分析出了的话,你必须手动解决。一个可能的手动修复的例子是将具有重复引用的内置场景从BuildSettings中提取出来,并使其成为一个Addressable场景。
2.3 Build Bundle Layout 构建包布局
此规则将显示如何在Addressable构建中显式标记为Addressable的assets。对于这些显式assets,我们还将给出哪些assets被构建隐式的引用了,并且最终会被拉进构建中。
根据这一规则收集的数据并不表明任何特定问题。这纯粹是信息。
3.Analyze扩展
创建一个AnalyzeRule类的子类,重写以下属性:
- CanFix: 告诉分析规则是否被认为是可修正的。
- ruleName 分析窗口上用来展示规则的名字。
你还需要重写以下方法,具体如下:
List <AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings) 刷新分析
在这个方法中写分析功能,并将信息填入 List <AnalyzeResult> 中返回
void FixIssues(AddressableAssetSettings settings) 修复操作
注意:如果您的规则被指定为不可修复,则不必重写FixIssues方法。
void ClearAnalysis() 清理操作
3.1扩展详细代码
/****************************************
* 作者: 闪电黑客
* 日期: 2022/12/19 16:57
* 描述: 地址重复分析器
*
* 给AdderssableAnalyze窗口添加分析重复地址的规则
*/
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Settings;
/// <summary>
/// 地址重复分析器
/// </summary>
public class AddressRepetitionAnalyzeRule : AnalyzeRule
{
/// <summary>
/// 饿汉单例
/// </summary>
[InitializeOnLoadMethod]
private static void SingletonEager()
{
AnalyzeSystem.RegisterNewRule<AddressRepetitionAnalyzeRule>();
}
public override string ruleName => "地址重复分析器";
/// <summary>
/// 刷新进行分析
/// </summary>
/// <returns>返回结果列表</returns>
public override List<AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings)
{
Dictionary<string, List<AddressableAssetEntry>> adderssCount = new Dictionary<string, List<AddressableAssetEntry>>();
foreach (var group in settings.groups)
{
foreach (var entrie in group.entries)
{
if (!adderssCount.TryGetValue(entrie.address, out List<AddressableAssetEntry> entries))
{
entries = new List<AddressableAssetEntry>();
adderssCount.Add(entrie.address, entries);
}
entries.Add(entrie);
}
}
List<AnalyzeResult> Analyzes = new List<AnalyzeResult>();
foreach (var adderssItem in adderssCount)
{
if (adderssItem.Value.Count != 1)
{
foreach (var entry in adderssItem.Value)
{
Analyzes.Add(new AnalyzeResult() { resultName = $"{adderssItem.Key}:[{entry.parentGroup.Name}]:{entry.AssetPath}", severity = MessageType.Warning });
}
}
}
if (Analyzes.Count == 0)
{
Analyzes.Add(new AnalyzeResult() { resultName = "未发现重复的地址", severity = MessageType.Info });
}
return Analyzes;
}
}
扩展结果: