YooAssetProxy.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using Cysharp.Threading.Tasks;
  2. using System;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.SceneManagement;
  6. using YooAsset;
  7. namespace ET
  8. {
  9. public static class YooAssetProxy
  10. {
  11. public enum YooAssetResType
  12. {
  13. Unit,
  14. Config,
  15. DataConfig,
  16. SkillConfig,
  17. Scene,
  18. Code,
  19. Effect,
  20. Shader,
  21. Material,
  22. Sound,
  23. PathFind,
  24. }
  25. #region 路径相关
  26. /// <summary>
  27. /// 获取YooAsset能识别的资源名
  28. /// </summary>
  29. /// <returns></returns>
  30. public static string GetYooAssetFormatResPath(string rawResName, YooAssetResType yooAssetResType)
  31. {
  32. return $"{yooAssetResType}_{rawResName}";
  33. }
  34. #endregion
  35. #region Extension
  36. public static T GetAsset<T>(this AssetOperationHandle assetOperationHandle)
  37. where T : UnityEngine.Object
  38. {
  39. return assetOperationHandle.GetAssetObject<T>();
  40. }
  41. public static T GetSubAsset<T>(this SubAssetsOperationHandle assetOperationHandle, string subAssetName)
  42. where T : UnityEngine.Object
  43. {
  44. return assetOperationHandle.GetSubAssetObject<T>(subAssetName);
  45. }
  46. public static byte[] GetRawBytes(this RawFileOperation rawFileOperation)
  47. {
  48. return rawFileOperation.LoadFileData();
  49. }
  50. public static string GetRawString(this RawFileOperation rawFileOperation)
  51. {
  52. return rawFileOperation.LoadFileText();
  53. }
  54. #endregion
  55. #region API
  56. public static async UniTask<AssetOperationHandle> LoadAssetAsync<T>(string path) where T : UnityEngine.Object
  57. {
  58. AssetOperationHandle assetOperationHandle = YooAssets.LoadAssetAsync<T>(path);
  59. await assetOperationHandle.ToUniTask();
  60. return assetOperationHandle;
  61. }
  62. public static async UniTask<SubAssetsOperationHandle> LoadSubAssetsAsync<T>(string mainAssetPath, string subAssetName)
  63. where T : UnityEngine.Object
  64. {
  65. SubAssetsOperationHandle subAssetsOperationHandle = YooAssets.LoadSubAssetsAsync<T>(mainAssetPath);
  66. await subAssetsOperationHandle.ToUniTask();
  67. return subAssetsOperationHandle;
  68. }
  69. public static async UniTask<SceneOperationHandle> LoadSceneAsync(string scenePath,
  70. LoadSceneMode loadSceneMode = LoadSceneMode.Single)
  71. {
  72. SceneOperationHandle sceneOperationHandle = YooAssets.LoadSceneAsync(scenePath, loadSceneMode, true);
  73. await sceneOperationHandle.ToUniTask();
  74. return sceneOperationHandle;
  75. }
  76. public static async UniTask<RawFileOperation> GetRawFileAsync(string path)
  77. {
  78. RawFileOperation rawFileOperation = YooAssets.GetRawFileAsync(path);
  79. await rawFileOperation.ToUniTask();
  80. return rawFileOperation;
  81. }
  82. public static void UnloadUnusedAssets()
  83. {
  84. YooAssets.UnloadUnusedAssets();
  85. }
  86. public static List<string> GetAssetPathsByTag(string tag)
  87. {
  88. AssetInfo[] assetInfos = YooAssets.GetAssetInfos(tag);
  89. List<string> result = new List<string>(16);
  90. foreach (var assetInfo in assetInfos)
  91. {
  92. result.Add(assetInfo.Address);
  93. }
  94. return result;
  95. }
  96. public static void InitHostCallbacks(Action<PatchEventMessageDefine.PatchStatesChange> onStateUpdate,
  97. Action<PatchEventMessageDefine.DownloadProgressUpdate> onDownLoadProgressUpdate)
  98. {
  99. PatchUpdater.InitCallback(onStateUpdate, onDownLoadProgressUpdate);
  100. }
  101. public static UniTask StartYooAssetEngine(YooAssets.EPlayMode playMode)
  102. {
  103. UniTaskCompletionSource uniTaskCompletionSource = new UniTaskCompletionSource();
  104. // 编辑器下的模拟模式
  105. if (playMode == YooAssets.EPlayMode.EditorSimulateMode)
  106. {
  107. var createParameters = new YooAssets.EditorSimulateModeParameters();
  108. createParameters.LocationServices = new AddressLocationServices();
  109. YooAssets.InitializeAsync(createParameters).Completed += _ => { uniTaskCompletionSource.TrySetResult(); };
  110. }
  111. // 单机运行模式
  112. if (playMode == YooAssets.EPlayMode.OfflinePlayMode)
  113. {
  114. var createParameters = new YooAssets.OfflinePlayModeParameters();
  115. createParameters.LocationServices = new AddressLocationServices();
  116. YooAssets.InitializeAsync(createParameters).Completed += _ => { uniTaskCompletionSource.TrySetResult(); };
  117. }
  118. // 联机运行模式
  119. if (playMode == YooAssets.EPlayMode.HostPlayMode)
  120. {
  121. var globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
  122. var createParameters = new YooAssets.HostPlayModeParameters();
  123. createParameters.LocationServices = new AddressLocationServices();
  124. createParameters.DecryptionServices = null;
  125. createParameters.ClearCacheWhenDirty = false;
  126. var hostServer = GetHostServerURL();
  127. createParameters.DefaultHostServer = hostServer;
  128. //作为DefaultHostServer的备份
  129. createParameters.FallbackHostServer = hostServer;
  130. //设置大于1Mb的资源支持断点续传
  131. createParameters.BreakpointResumeFileSize = 1 * 1014 * 1024;
  132. string GetHostServerURL()
  133. {
  134. string hostServerIP = globalConfig.HotfixResUrl;
  135. string gameVersion = globalConfig.Version;
  136. #if UNITY_EDITOR
  137. if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android)
  138. return $"{hostServerIP}/android/{gameVersion}";
  139. else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS)
  140. return $"{hostServerIP}/ios/{gameVersion}";
  141. else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL)
  142. return $"{hostServerIP}/web/{gameVersion}";
  143. else
  144. return $"{hostServerIP}/pc/{gameVersion}";
  145. #else
  146. if (Application.platform == RuntimePlatform.Android)
  147. return $"{hostServerIP}/android/{gameVersion}";
  148. else if (Application.platform == RuntimePlatform.IPhonePlayer)
  149. return $"{hostServerIP}/ios/{gameVersion}";
  150. else if (Application.platform == RuntimePlatform.WebGLPlayer)
  151. return $"{hostServerIP}/web/{gameVersion}";
  152. else
  153. return $"{hostServerIP}/pc/{gameVersion}";
  154. #endif
  155. }
  156. // 如果是资源热更模式,则需要等待热更完毕后再Invoke回调
  157. YooAssets.InitializeAsync(createParameters).Completed += _ =>
  158. {
  159. // 运行补丁流程
  160. PatchUpdater.Run(uniTaskCompletionSource);
  161. };
  162. }
  163. return uniTaskCompletionSource.Task;
  164. }
  165. #endregion
  166. }
  167. }