Unity Addressables资源管理 分析器 AnalyzeRule

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

扩展结果:

猜你喜欢

转载自blog.csdn.net/qq_40346899/article/details/128375152
今日推荐