using XGame.Editor.Asset;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace XGame.Editor.Build.AssetBundles
{
///
/// 收集bundle引用
///
internal class BundleRefsController
{
private BundleContext _context;
private AssetBundleCollector _collector;
public BundleRefsController(BundleContext context, AssetBundleCollector collector)
{
_context = context;
_collector = collector;
}
internal void CollectForResAddressable()
{
_collector.CollectBundleBuilds(false);
var assetsMap = new Dictionary();
var dependenciesMap = new Dictionary();
var refBundlesMap = new Dictionary>();
var tmpDependencies = new HashSet();
foreach (var item in _context.bundleDataMap)
{
var assetNames = item.Value.assetNames;
if (assetNames.Length == 1)
continue;
var dependencies = AssetDatabase.GetDependencies(item.Value.assetNames, true);
tmpDependencies.Clear();
foreach (var dependency in dependencies)
{
if (dependency.Contains(PathDefine.ResAddressableName) == false ||
Asset.FileUtil.IsFileIgnore(dependency) ||
assetNames.Contains(dependency))
{
continue;
}
tmpDependencies.Add(dependency);
}
if (tmpDependencies.Count > 0)
{
var bundleId = item.Key;
dependenciesMap.Add(bundleId, tmpDependencies.ToArray());
foreach (var assetPath in assetNames)
{
assetsMap.Add(assetPath, bundleId);
}
tmpDependencies.Clear();
}
}
foreach (var item in dependenciesMap)
{
var bundleId = item.Key;
var dependencies = item.Value;
foreach (var dependency in dependencies)
{
if (assetsMap.TryGetValue(dependency, out var depBundleId) && depBundleId != bundleId)
{
if (!refBundlesMap.TryGetValue(dependency, out var depBundleIds))
{
depBundleIds = new HashSet();
refBundlesMap.Add(dependency, depBundleIds);
}
depBundleIds.Add(bundleId);
}
}
}
var sb = new System.Text.StringBuilder();
sb.Append($"被引用的Addressable资源数量:{refBundlesMap.Count}\n");
foreach (var item in refBundlesMap)
{
//sb.Clear();
sb.Append($"Asset:{item.Key} 被{item.Value.Count}个Assetbundle引用。 BundleNames:");
foreach (var bundleId in item.Value)
{
sb.Append($" [{_context.bundleDataMap[bundleId].originBundleName}]");
}
sb.Append("\n");
//Debug.Log(sb.ToString());
}
OutputText(sb.ToString());
}
private void OutputText(string text)
{
try
{
var path = Path.GetTempPath() + Path.GetRandomFileName();
File.WriteAllText(path, text);
#if UNITY_EDITOR_WIN
var proc = System.Diagnostics.Process.Start("notepad.exe", path);
#else
Debug.Log($"Output:{path}");
#endif
}
catch (Exception e)
{
Debug.LogException(e);
}
}
}
}