|
@@ -0,0 +1,135 @@
|
|
|
+using FairyGUI;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using UnityEngine;
|
|
|
+using YooAsset;
|
|
|
+
|
|
|
+namespace GFGGame
|
|
|
+{
|
|
|
+ public class GFGUIPackage
|
|
|
+ {
|
|
|
+ private static Dictionary<string, UIPackage> _packages = new Dictionary<string, UIPackage>();
|
|
|
+ private static Dictionary<string, List<AssetOperationHandle>> assetHandleCacheDic = new Dictionary<string, List<AssetOperationHandle>>();
|
|
|
+ private static Dictionary<string, int> _assetCount = new Dictionary<string, int>();
|
|
|
+
|
|
|
+ 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<TextAsset>($"{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.CheckDressUpResExist(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<TextAsset>($"{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.CheckDressUpResExist(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.CheckDressUpResExist(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<AssetOperationHandle> list = null;
|
|
|
+ if (!assetHandleCacheDic.TryGetValue(key, out list))
|
|
|
+ {
|
|
|
+ list = new List<AssetOperationHandle>();
|
|
|
+ assetHandleCacheDic.Add(key, list);
|
|
|
+ }
|
|
|
+ list.Add(handle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|