using FairyGUI; using System.Collections.Generic; using UnityEngine; using YooAsset; using System.Threading.Tasks; namespace GFGGame { public class GFGUIPackage { private static Dictionary _packages = new Dictionary(); private static Dictionary> assetHandleCacheDic = new Dictionary>(); private static Dictionary _assetCount = new Dictionary(); public static void AddPackage(string descFilePath) { _assetCount.TryGetValue(descFilePath, out var count); if (count > 0) { _assetCount[descFilePath] = count + 1; return; } _assetCount.Add(descFilePath, count + 1); var handle = YooAssets.LoadAssetSync($"{descFilePath}_fui.bytes"); TextAsset textAsset = handle.AssetObject as TextAsset; CacheAssetHandle(descFilePath, handle); //同步 var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath, (string name, string extension, System.Type type, out DestroyMethod destroyMethod) => { string location = name + extension; destroyMethod = DestroyMethod.None; //注意:这里一定要设置为None if (!YooAssets.CheckResExist(location)) { return null; } var handle = YooAssets.LoadAssetSync(location, type); CacheAssetHandle(descFilePath, handle); return handle.AssetObject; }); _packages.Add(descFilePath, uiPackage); } public static async Task AddPackageAsync(string descFilePath) { _assetCount.TryGetValue(descFilePath, out var count); if (count > 0) { _assetCount[descFilePath] = count + 1; return; } _assetCount.Add(descFilePath, count + 1); var handle = YooAssets.LoadAssetAsync($"{descFilePath}_fui.bytes"); await handle.Task; TextAsset textAsset = handle.AssetObject as TextAsset; CacheAssetHandle(descFilePath, handle); var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath, (string name, string extension, System.Type type, PackageItem item) => { string location = name + extension; if (!YooAssets.CheckResExist(location)) { return; } AssetOperationHandle handle = YooAssets.LoadAssetAsync(location, type); CacheAssetHandle(descFilePath, handle); handle.Completed += (handle) => { if (handle.AssetObject == null) return; Texture tex = handle.AssetObject as Texture; if (tex != null) { string location = name + "!a" + extension; if (YooAssets.CheckResExist(location)) { AssetOperationHandle handleAlpha = YooAssets.LoadAssetAsync(location, type); CacheAssetHandle(descFilePath, handleAlpha); handleAlpha.Completed += (handle1) => { if (handle1.AssetObject == null) return; Texture alphaTex = handle1.AssetObject as Texture; item.owner.SetItemAsset(item, tex, alphaTex, DestroyMethod.None);//注意:这里一定要设置为None }; return; } } item.owner.SetItemAsset(item, handle.AssetObject, null, DestroyMethod.None);//注意:这里一定要设置为None }; }); _packages.Add(descFilePath, uiPackage); CheckRemovePackage(descFilePath); } public static void ReleasePackage(string descFilePath) { _assetCount.TryGetValue(descFilePath, out var count); if (count > 0) { count--; _assetCount[descFilePath] = count; CheckRemovePackage(descFilePath); } } private static void CheckRemovePackage(string descFilePath) { _assetCount.TryGetValue(descFilePath, out var count); if (count > 0) return; _packages.TryGetValue(descFilePath, out var package); if (package == null) return; _assetCount.Remove(descFilePath); _packages.Remove(descFilePath); UIPackage.RemovePackage(package.name); if (assetHandleCacheDic.TryGetValue(descFilePath, out var list)) { foreach (var asset in list) { asset.Release(); } list.Clear(); } } private static void CacheAssetHandle(string key, AssetOperationHandle handle) { List list = null; if (!assetHandleCacheDic.TryGetValue(key, out list)) { list = new List(); assetHandleCacheDic.Add(key, list); } list.Add(handle); } } }