Files
Fishing2/Assets/Scripts/NBC/Asset/Editor/Simulate/AddressableEditImpl.cs
2025-12-24 00:09:28 +08:00

213 lines
6.6 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
namespace NBC.Asset.Editor
{
/// <summary>
/// 开发期寻址管理
/// </summary>
public class AddressableEditImpl : IAddressableImpl
{
public static IAddressableImpl CreateInstance()
{
return new AddressableEditImpl();
}
private readonly Dictionary<string, BundleData> _bundles = new Dictionary<string, BundleData>();
private readonly Dictionary<string, AssetData> _assets = new Dictionary<string, AssetData>();
private readonly Dictionary<string, string> _addressablePath = new Dictionary<string, string>();
private readonly Dictionary<string, AssetInfo> _assetInfos = new Dictionary<string, AssetInfo>();
private readonly Dictionary<string, BundleInfo> _bundleInfos = new Dictionary<string, BundleInfo>();
private bool _isConfig;
public void Load()
{
var collectorSetting = CollectorSetting.Instance;
var caches = Caches.Get();
if (collectorSetting.Packages.Count > 0)
{
_isConfig = true;
LoadCaches();
}
if (!_isConfig)
{
Debug.LogWarning("没有配置收集规则,无法使用寻址模式,且只能用于编辑器开发测试。若要打包发布请先配置资源收集规则!");
}
else
{
if (caches.Bundles.Count < 1)
{
_isConfig = false;
Debug.LogWarning("没有被收集的资源,请检查收集规则是否有误!将启用开发模式");
}
}
}
public VersionData GetVersionData()
{
return null;
}
public PackageData GetPackageData(string packageName)
{
return null;
}
public void UpdateBundleInfo(string bundleName)
{
}
public AssetInfo GetAssetInfo(string path, Type type)
{
if (_addressablePath.TryGetValue(path, out var pathReal))
{
path = pathReal;
}
var guid = Util.GetAssetGUID(path, type);
if (!_assetInfos.TryGetValue(guid, out var info))
{
var data = GetAsset(path);
if (data != null)
{
info = new AssetInfo(data, type);
_assetInfos[info.GUID] = info;
}
}
return info;
}
public BundleInfo GetBundleInfo(AssetInfo assetInfo)
{
var bundleData = GetBundleByAsset(assetInfo.Path);
return GetBundleInfo(bundleData);
}
public BundleInfo GetBundleInfo(BundleData bundleData)
{
if (!_bundleInfos.TryGetValue(bundleData.Name, out var bundleInfo))
{
bundleInfo = new BundleInfo(bundleData);
bundleInfo.LoadMode = BundleLoadMode.LoadFromStreaming;
_bundleInfos[bundleData.Name] = bundleInfo;
}
return bundleInfo;
}
public BundleInfo[] GetAllBundleInfo()
{
List<BundleInfo> list = new List<BundleInfo>();
list.AddRange(_bundleInfos.Values);
return list.ToArray();
}
public BundleInfo[] GetAllDependBundleInfos(AssetInfo assetInfo)
{
if (_assets.TryGetValue(assetInfo.Path, out var assetData))
{
if (_bundles.TryGetValue(assetData.BundleName, out var bundleData))
{
List<BundleData> needBundle = new List<BundleData>();
needBundle.Add(bundleData);
needBundle.AddRange(bundleData.DependBundles.Select(bundle => _bundles[bundle]));
List<BundleInfo> list = new List<BundleInfo>();
foreach (var bundle in needBundle)
{
list.Add(GetBundleInfo(bundle));
}
return list.ToArray();
}
}
return Array.Empty<BundleInfo>();
}
#region Privite
private string GetAssetRealPath(string path)
{
return _addressablePath.GetValueOrDefault(path, path);
}
private void LoadCaches()
{
var caches = Caches.Get();
foreach (var bundle in caches.Bundles)
{
BundleData bundleData = new BundleData();
bundleData.Name = bundle.Name;
bundleData.Hash = bundle.Hash;
bundleData.Size = bundle.Size;
_bundles[bundle.Name] = bundleData;
}
foreach (var asset in caches.Assets)
{
var path = asset.Path;
if (string.IsNullOrEmpty(path)) continue;
AssetData assetData = new AssetData();
assetData.Name = Path.GetFileName(path);
assetData.Path = path;
assetData.BundleName = asset.Bundle;
assetData.Address = asset.Address;
if (!string.IsNullOrEmpty(asset.Tags))
{
//assetData.SetTags(asset.Tags.Split(","));
}
_assets[path] = assetData;
//没后缀的默认加入地址 .prefab
var ext = Path.GetExtension(path);
var fileName = path.Replace(ext, "");
_addressablePath[fileName] = assetData.Path;
if (assetData.Address != null)
{
_addressablePath[assetData.Address] = assetData.Path;
}
}
}
private BundleData GetBundle(string name)
{
return _bundles.TryGetValue(name, out var bundleRef) ? bundleRef : null;
}
private BundleData GetBundleByAsset(string assetPath)
{
var asset = GetAsset(assetPath);
return asset == null ? null : GetBundle(asset.BundleName);
}
private AssetData GetAsset(string path)
{
if (!_assets.TryGetValue(path, out var assetRef))
{
if (_isConfig)
{
return null;
}
//未配置的测试模式
assetRef = new AssetData();
assetRef.Path = path;
}
return assetRef;
}
#endregion
}
}