打开的窗口
此规则通过扫描所有使用BundledAssetGroupSchemas的组,
并投影asset组布局来检查可能冗余的asset。
这实际上会触发一个完整的构建,所以这个检查是非常耗时和耗费性能的。
问题:冗余的asset是由于不同组中的asset共享依赖关系,例如,两个Prefabs 共享存在于不同Addressable Group中的一个 material 。这些material (以及它的任何依赖)都会被分成两个组,每组都有Prefabs 。为了防止这种情况发生,必须将material 标记为Addressable,或者放在其中一个Prefabs中,或者放在它自己的空间中,从而将该material 及其依赖项归在一个单独的Addressable Group中。
解决方法:如果此检查发现任何问题,则对此规则运行修复操作会创建一个新的可寻址组,以在其中移动所有依赖资产。
此规则检测在构建的Addressable 数据和驻留在Resources文件夹中的assets 之间是否存在任何assets 或assets 依赖项冗余。
问题:这些冗余意味着数据将同时包含在应用程序构建和Addressable构建中。
解决方案:这条规则是不可修复的,因为不存在适当的操作。这是纯粹的信息,提醒你注意冗余。如果分析出了的话,你必须手动解决。一个可能的手动修复示例是将违规assets 移出Resources文件夹,并使其变为Addressable。
此规则检测编辑器场景列表中的场景和Addressable中的场景之间共享的任何assets或assets依赖项。
问题:这些冗余意味着数据将同时包含在应用程序构建和Addressable构建中。
解决方案:这纯粹是信息,提醒您注意冗余。如果分析出了的话,你必须手动解决。一个可能的手动修复的例子是将具有重复引用的内置场景从BuildSettings中提取出来,并使其成为一个Addressable场景。
此规则将显示如何在Addressable构建中显式标记为Addressable的assets。对于这些显式assets,我们还将给出哪些assets被构建隐式的引用了,并且最终会被拉进构建中。
根据这一规则收集的数据并不表明任何特定问题。这纯粹是信息。
创建一个AnalyzeRule类的子类,重写以下属性:
你还需要重写以下方法,具体如下:
List
在这个方法中写分析功能,并将信息填入 List
void FixIssues(AddressableAssetSettings settings) 修复操作
注意:如果您的规则被指定为不可修复,则不必重写FixIssues方法。
void ClearAnalysis() 清理操作
/****************************************
* 作者: 闪电黑客
* 日期: 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;
///
/// 地址重复分析器
///
public class AddressRepetitionAnalyzeRule : AnalyzeRule
{
///
/// 饿汉单例
///
[InitializeOnLoadMethod]
private static void SingletonEager()
{
AnalyzeSystem.RegisterNewRule();
}
public override string ruleName => "地址重复分析器";
///
/// 刷新进行分析
///
/// 返回结果列表
public override List RefreshAnalysis(AddressableAssetSettings settings)
{
Dictionary> adderssCount = new Dictionary>();
foreach (var group in settings.groups)
{
foreach (var entrie in group.entries)
{
if (!adderssCount.TryGetValue(entrie.address, out List entries))
{
entries = new List();
adderssCount.Add(entrie.address, entries);
}
entries.Add(entrie);
}
}
List Analyzes = new List();
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;
}
}
扩展结果: