GFGUIPackage.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using FairyGUI;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using YooAsset;
  5. using System.Threading.Tasks;
  6. namespace GFGGame
  7. {
  8. public class GFGUIPackage
  9. {
  10. private static Dictionary<string, UIPackage> _packages = new Dictionary<string, UIPackage>();
  11. private static Dictionary<string, List<AssetOperationHandle>> assetHandleCacheDic =
  12. new Dictionary<string, List<AssetOperationHandle>>();
  13. private static Dictionary<string, int> _assetCount = new Dictionary<string, int>();
  14. /// <summary>
  15. /// 同步加载 FairyGUI 包
  16. /// </summary>
  17. public static void AddPackage(string descFilePath)
  18. {
  19. _assetCount.TryGetValue(descFilePath, out var count);
  20. if (count > 0)
  21. {
  22. _assetCount[descFilePath] = count + 1;
  23. return;
  24. }
  25. _assetCount.Add(descFilePath, count + 1);
  26. var handle = YooAssets.LoadAssetSync<TextAsset>($"{descFilePath}_fui.bytes");
  27. TextAsset textAsset = handle.AssetObject as TextAsset;
  28. CacheAssetHandle(descFilePath, handle);
  29. var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath, LoadResourceSync);
  30. _packages.Add(descFilePath, uiPackage);
  31. }
  32. /// <summary>
  33. /// 异步加载 FairyGUI 包(支持 await)
  34. /// </summary>
  35. public static async Task AddPackageAsync(string descFilePath)
  36. {
  37. _assetCount.TryGetValue(descFilePath, out var count);
  38. if (count > 0)
  39. {
  40. _assetCount[descFilePath] = count + 1;
  41. return;
  42. }
  43. _assetCount.Add(descFilePath, count + 1);
  44. // 1. 异步加载描述文件
  45. var handle = YooAssets.LoadAssetAsync<TextAsset>($"{descFilePath}_fui.bytes");
  46. await handle.Task;
  47. if (handle.Status != EOperationStatus.Succeed)
  48. throw new System.Exception($"Failed to load package: {descFilePath}");
  49. // 2. 添加包
  50. TextAsset textAsset = handle.AssetObject as TextAsset;
  51. CacheAssetHandle(descFilePath, handle);
  52. var uiPackage = UIPackage.AddPackage(textAsset.bytes, descFilePath, LoadResourceAsync);
  53. _packages.Add(descFilePath, uiPackage);
  54. CheckRemovePackage(descFilePath);
  55. }
  56. /// <summary>
  57. /// 同步加载资源回调
  58. /// </summary>
  59. private static object LoadResourceSync(string name, string extension, System.Type type,
  60. out DestroyMethod destroyMethod)
  61. {
  62. destroyMethod = DestroyMethod.None;
  63. string location = name + extension;
  64. if (!YooAssets.CheckResExist(location))
  65. return null;
  66. var handle = YooAssets.LoadAssetSync(location, type);
  67. CacheAssetHandle(name, handle);
  68. return handle.AssetObject;
  69. }
  70. /// <summary>
  71. /// 异步加载资源回调
  72. /// </summary>
  73. private static void LoadResourceAsync(string name, string extension, System.Type type, PackageItem item)
  74. {
  75. string location = name + extension;
  76. if (!YooAssets.CheckResExist(location))
  77. return;
  78. AssetOperationHandle handle = YooAssets.LoadAssetAsync(location, type);
  79. CacheAssetHandle(name, handle);
  80. handle.Completed += (op) =>
  81. {
  82. if (op.AssetObject == null) return;
  83. // 处理带 Alpha 通道的纹理
  84. if (op.AssetObject is Texture tex)
  85. {
  86. string alphaLocation = name + "!a" + extension;
  87. if (YooAssets.CheckResExist(alphaLocation))
  88. {
  89. var alphaHandle = YooAssets.LoadAssetAsync(alphaLocation, type);
  90. CacheAssetHandle(name, alphaHandle);
  91. alphaHandle.Completed += (alphaOp) =>
  92. {
  93. if (alphaOp.AssetObject is Texture alphaTex)
  94. item.owner.SetItemAsset(item, tex, alphaTex, DestroyMethod.None);
  95. };
  96. return;
  97. }
  98. }
  99. item.owner.SetItemAsset(item, op.AssetObject, null, DestroyMethod.None);
  100. };
  101. }
  102. public static void ReleasePackage(string descFilePath)
  103. {
  104. if (_assetCount.TryGetValue(descFilePath, out var count) && count > 0)
  105. {
  106. _assetCount[descFilePath] = count - 1;
  107. CheckRemovePackage(descFilePath);
  108. }
  109. }
  110. private static void CheckRemovePackage(string descFilePath)
  111. {
  112. if (_assetCount.TryGetValue(descFilePath, out var count) && count <= 0)
  113. {
  114. if (_packages.TryGetValue(descFilePath, out var package))
  115. {
  116. UIPackage.RemovePackage(package.name);
  117. _packages.Remove(descFilePath);
  118. _assetCount.Remove(descFilePath);
  119. }
  120. if (assetHandleCacheDic.TryGetValue(descFilePath, out var handles))
  121. {
  122. foreach (var handle in handles)
  123. handle.Release();
  124. handles.Clear();
  125. }
  126. }
  127. }
  128. private static void CacheAssetHandle(string key, AssetOperationHandle handle)
  129. {
  130. if (!assetHandleCacheDic.TryGetValue(key, out var list))
  131. {
  132. list = new List<AssetOperationHandle>();
  133. assetHandleCacheDic.Add(key, list);
  134. }
  135. list.Add(handle);
  136. }
  137. }
  138. }