ResourcesComponent.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using YooAsset;
  5. namespace ET
  6. {
  7. /// <summary>
  8. /// 远端资源地址查询服务类
  9. /// </summary>
  10. public class RemoteServices : IRemoteServices
  11. {
  12. private readonly string _defaultHostServer;
  13. private readonly string _fallbackHostServer;
  14. public RemoteServices(string defaultHostServer, string fallbackHostServer)
  15. {
  16. _defaultHostServer = defaultHostServer;
  17. _fallbackHostServer = fallbackHostServer;
  18. }
  19. string IRemoteServices.GetRemoteMainURL(string fileName)
  20. {
  21. return $"{_defaultHostServer}/{fileName}";
  22. }
  23. string IRemoteServices.GetRemoteFallbackURL(string fileName)
  24. {
  25. return $"{_fallbackHostServer}/{fileName}";
  26. }
  27. }
  28. public class ResourcesComponent : Singleton<ResourcesComponent>, ISingletonAwake
  29. {
  30. public void Awake()
  31. {
  32. YooAssets.Initialize();
  33. }
  34. protected override void Destroy()
  35. {
  36. YooAssets.OnApplicationQuit();
  37. }
  38. public async ETTask CreatePackageAsync(string packageName, bool isDefault = false)
  39. {
  40. YooConfig yooConfig = Resources.Load<YooConfig>("YooConfig");
  41. ResourcePackage package = YooAssets.CreatePackage(packageName);
  42. if (isDefault)
  43. {
  44. YooAssets.SetDefaultPackage(package);
  45. }
  46. // 编辑器下的模拟模式
  47. switch (yooConfig.EPlayMode)
  48. {
  49. case EPlayMode.EditorSimulateMode:
  50. {
  51. PackageInvokeBuildResult buildResult = EditorSimulateModeHelper.SimulateBuild(packageName);
  52. string packageRoot = buildResult.PackageRootDirectory;
  53. FileSystemParameters editorFileSystemParams = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot);
  54. EditorSimulateModeParameters initParameters = new();
  55. initParameters.EditorFileSystemParameters = editorFileSystemParams;
  56. await package.InitializeAsync(initParameters).Task;
  57. break;
  58. }
  59. case EPlayMode.OfflinePlayMode:
  60. {
  61. FileSystemParameters buildinFileSystemParams = FileSystemParameters.CreateDefaultBuildinFileSystemParameters();
  62. OfflinePlayModeParameters initParameters = new();
  63. initParameters.BuildinFileSystemParameters = buildinFileSystemParams;
  64. await package.InitializeAsync(initParameters).Task;
  65. break;
  66. }
  67. case EPlayMode.HostPlayMode:
  68. {
  69. string defaultHostServer = GetHostServerURL(yooConfig.Url, package.PackageName);
  70. string fallbackHostServer = GetHostServerURL(yooConfig.Url, package.PackageName);
  71. IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
  72. FileSystemParameters cacheFileSystemParams = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices);
  73. FileSystemParameters buildinFileSystemParams = FileSystemParameters.CreateDefaultBuildinFileSystemParameters();
  74. HostPlayModeParameters initParameters = new();
  75. initParameters.BuildinFileSystemParameters = buildinFileSystemParams;
  76. initParameters.CacheFileSystemParameters = cacheFileSystemParams;
  77. await package.InitializeAsync(initParameters).Task;
  78. break;
  79. }
  80. case EPlayMode.WebPlayMode:
  81. {
  82. string defaultHostServer = GetHostServerURL(yooConfig.Url, package.PackageName);
  83. string fallbackHostServer = GetHostServerURL(yooConfig.Url, package.PackageName);
  84. IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
  85. FileSystemParameters webServerFileSystemParams = FileSystemParameters.CreateDefaultWebServerFileSystemParameters();
  86. FileSystemParameters webRemoteFileSystemParams = FileSystemParameters.CreateDefaultWebRemoteFileSystemParameters(remoteServices); //支持跨域下载
  87. WebPlayModeParameters initParameters = new();
  88. initParameters.WebServerFileSystemParameters = webServerFileSystemParams;
  89. initParameters.WebRemoteFileSystemParameters = webRemoteFileSystemParams;
  90. await package.InitializeAsync(initParameters).Task;
  91. break;
  92. }
  93. default:
  94. throw new ArgumentOutOfRangeException();
  95. }
  96. RequestPackageVersionOperation op = package.RequestPackageVersionAsync();
  97. await op.Task;
  98. await package.UpdatePackageManifestAsync(op.PackageVersion).Task;
  99. }
  100. string GetHostServerURL(string url, string pacakgeName)
  101. {
  102. //string hostServerIP = "http://10.0.2.2"; //安卓模拟器地址
  103. string hostServerIP = url;
  104. string appVersion = "v1.0";
  105. #if UNITY_EDITOR
  106. switch (UnityEditor.EditorUserBuildSettings.activeBuildTarget)
  107. {
  108. case UnityEditor.BuildTarget.Android:
  109. return $"{hostServerIP}/CDN/Android/{appVersion}";
  110. case UnityEditor.BuildTarget.iOS:
  111. return $"{hostServerIP}/CDN/IPhone/{appVersion}";
  112. case UnityEditor.BuildTarget.WebGL:
  113. {
  114. return $"{hostServerIP}/StreamingAssets/Bundles/{pacakgeName}";
  115. }
  116. default:
  117. return $"{hostServerIP}/CDN/PC/{appVersion}";
  118. }
  119. #else
  120. switch (Application.platform)
  121. {
  122. case RuntimePlatform.Android:
  123. return $"{hostServerIP}/CDN/Android/{appVersion}";
  124. case RuntimePlatform.IPhonePlayer:
  125. return $"{hostServerIP}/CDN/IPhone/{appVersion}";
  126. case RuntimePlatform.WebGLPlayer:
  127. {
  128. return $"{hostServerIP}/StreamingAssets/Bundles/{pacakgeName}";
  129. }
  130. default:
  131. return $"{hostServerIP}/CDN/PC/{appVersion}";
  132. }
  133. #endif
  134. }
  135. public void DestroyPackage(string packageName)
  136. {
  137. ResourcePackage package = YooAssets.GetPackage(packageName);
  138. package.DestroyPackage();
  139. }
  140. /// <summary>
  141. /// 主要用来加载dll config aotdll,因为这时候纤程还没创建,无法使用ResourcesLoaderComponent。
  142. /// 游戏中的资源应该使用ResourcesLoaderComponent来加载
  143. /// </summary>
  144. public async ETTask<T> LoadAssetAsync<T>(string location) where T : UnityEngine.Object
  145. {
  146. AssetHandle handle = YooAssets.LoadAssetAsync<T>(location);
  147. await handle.Task;
  148. T t = (T)handle.AssetObject;
  149. handle.Release();
  150. return t;
  151. }
  152. /// <summary>
  153. /// 主要用来加载dll config aotdll,因为这时候纤程还没创建,无法使用ResourcesLoaderComponent。
  154. /// 游戏中的资源应该使用ResourcesLoaderComponent来加载
  155. /// </summary>
  156. public async ETTask<Dictionary<string, T>> LoadAllAssetsAsync<T>(string location) where T : UnityEngine.Object
  157. {
  158. AllAssetsHandle allAssetsOperationHandle = YooAssets.LoadAllAssetsAsync<T>(location);
  159. await allAssetsOperationHandle.Task;
  160. Dictionary<string, T> dictionary = new Dictionary<string, T>();
  161. foreach (UnityEngine.Object assetObj in allAssetsOperationHandle.AllAssetObjects)
  162. {
  163. T t = assetObj as T;
  164. dictionary.Add(t.name, t);
  165. }
  166. allAssetsOperationHandle.Release();
  167. return dictionary;
  168. }
  169. }
  170. }