using System; using System.Collections; using System.Collections.Generic; using System.Linq; using AYellowpaper.SerializedCollections; using UnityEngine; using YooAsset; using Object = UnityEngine.Object; using Random = UnityEngine.Random; #if UNITY_EDITOR using UnityEditor; #endif namespace BITKit { public class AddressableHelper:MonoBehaviour { private static IDictionary PathsById { get; } = new Dictionary(); public static T Get(ulong id) where T : Object { var task = YooAssets.LoadAssetAsync(PathsById[id]); task.WaitForAsyncComplete(); return task.AssetObject.As(); } [SerializeField] private SerializedDictionary pathsById; private void Start() { PathsById.Clear(); foreach (var x in pathsById) { PathsById.Add(x.Key,x.Value); } } #if UNITY_EDITOR [BIT] private void BuildCache() { var guids = AssetDatabase.FindAssets($"t:Object",new[] {"Assets"}); var paths = guids.Select(AssetDatabase.GUIDToAssetPath); var objects = new List(); var stringBuilder = new System.Text.StringBuilder(); foreach (var path in paths) { var asset = AssetDatabase.LoadAssetAtPath(path); switch (asset) { case GameObject go when go.TryGetComponent(out IAddressable addressable): objects.Add(addressable); break; case IAddressable addressable: objects.Add(addressable); break; } } stringBuilder.AppendLine($"所有资源数量:{guids.Length},其中包含{objects.Count}个Addressable资源"); pathsById.Clear(); foreach (var x in objects) { if (x is not Object unityObject) continue; //if (x.AddressableId is ulong.MinValue or ulong.MaxValue) { x.AddressableId = RandomUlong.NextUlong; EditorUtility.SetDirty(unityObject); } try { if (x.AddressableId is not ulong.MinValue && !string.IsNullOrEmpty(x.AddressablePath)) { if (pathsById.TryAdd(x.AddressableId, x.AddressablePath)) { } else { stringBuilder.AppendLine($"资源{unityObject.name}的AddressableId:{x.AddressableId}已经存在"); } } else { stringBuilder.AppendLine($"{unityObject.name}的AddressableId或AddressablePath为空"); } } catch (Exception e) { stringBuilder.AppendLine($"{unityObject.name}遇到了错误:{e.Message}"); } } EditorUtility.SetDirty(this); Debug.Log(stringBuilder); } #endif } public static class RandomUlong { private static readonly System.Random _random = new(); public static ulong NextUlong { get { var buf = new byte[8]; _random.NextBytes(buf); return BitConverter.ToUInt64(buf, 0); } } } }