ResourcesComponent.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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.Destroy();
  37. }
  38. public async ETTask CreatePackageAsync(string packageName, bool isDefault = false)
  39. {
  40. ResourcePackage package = YooAssets.CreatePackage(packageName);
  41. if (isDefault)
  42. {
  43. YooAssets.SetDefaultPackage(package);
  44. }
  45. GlobalConfig globalConfig = Resources.Load<GlobalConfig>("GlobalConfig");
  46. EPlayMode ePlayMode = globalConfig.EPlayMode;
  47. // 编辑器下的模拟模式
  48. switch (ePlayMode)
  49. {
  50. case EPlayMode.EditorSimulateMode:
  51. {
  52. EditorSimulateModeParameters createParameters = new();
  53. createParameters.SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild("ScriptableBuildPipeline", packageName);
  54. await package.InitializeAsync(createParameters).Task;
  55. break;
  56. }
  57. case EPlayMode.OfflinePlayMode:
  58. {
  59. OfflinePlayModeParameters createParameters = new();
  60. await package.InitializeAsync(createParameters).Task;
  61. break;
  62. }
  63. case EPlayMode.HostPlayMode:
  64. {
  65. string defaultHostServer = GetHostServerURL();
  66. string fallbackHostServer = GetHostServerURL();
  67. HostPlayModeParameters createParameters = new();
  68. createParameters.BuildinQueryServices = new GameQueryServices();
  69. createParameters.RemoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
  70. await package.InitializeAsync(createParameters).Task;
  71. break;
  72. }
  73. default:
  74. throw new ArgumentOutOfRangeException();
  75. }
  76. }
  77. static string GetHostServerURL()
  78. {
  79. //string hostServerIP = "http://10.0.2.2"; //安卓模拟器地址
  80. string hostServerIP = "http://127.0.0.1";
  81. string appVersion = "v1.0";
  82. #if UNITY_EDITOR
  83. if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.Android)
  84. {
  85. return $"{hostServerIP}/CDN/Android/{appVersion}";
  86. }
  87. else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.iOS)
  88. {
  89. return $"{hostServerIP}/CDN/IPhone/{appVersion}";
  90. }
  91. else if (UnityEditor.EditorUserBuildSettings.activeBuildTarget == UnityEditor.BuildTarget.WebGL)
  92. {
  93. return $"{hostServerIP}/CDN/WebGL/{appVersion}";
  94. }
  95. return $"{hostServerIP}/CDN/PC/{appVersion}";
  96. #else
  97. if (Application.platform == RuntimePlatform.Android)
  98. {
  99. return $"{hostServerIP}/CDN/Android/{appVersion}";
  100. }
  101. else if (Application.platform == RuntimePlatform.IPhonePlayer)
  102. {
  103. return $"{hostServerIP}/CDN/IPhone/{appVersion}";
  104. }
  105. else if (Application.platform == RuntimePlatform.WebGLPlayer)
  106. {
  107. return $"{hostServerIP}/CDN/WebGL/{appVersion}";
  108. }
  109. return $"{hostServerIP}/CDN/PC/{appVersion}";
  110. #endif
  111. }
  112. public void DestroyPackage(string packageName)
  113. {
  114. ResourcePackage package = YooAssets.GetPackage(packageName);
  115. package.UnloadUnusedAssets();
  116. }
  117. /// <summary>
  118. /// 主要用来加载dll config aotdll,因为这时候纤程还没创建,无法使用ResourcesLoaderComponent。
  119. /// 游戏中的资源应该使用ResourcesLoaderComponent来加载
  120. /// </summary>
  121. public async ETTask<T> LoadAssetAsync<T>(string location) where T : UnityEngine.Object
  122. {
  123. AssetHandle handle = YooAssets.LoadAssetAsync<T>(location);
  124. await handle.Task;
  125. T t = (T)handle.AssetObject;
  126. handle.Release();
  127. return t;
  128. }
  129. /// <summary>
  130. /// 主要用来加载dll config aotdll,因为这时候纤程还没创建,无法使用ResourcesLoaderComponent。
  131. /// 游戏中的资源应该使用ResourcesLoaderComponent来加载
  132. /// </summary>
  133. public async ETTask<Dictionary<string, T>> LoadAllAssetsAsync<T>(string location) where T : UnityEngine.Object
  134. {
  135. AllAssetsHandle allAssetsOperationHandle = YooAssets.LoadAllAssetsAsync<T>(location);
  136. await allAssetsOperationHandle.Task;
  137. Dictionary<string, T> dictionary = new Dictionary<string, T>();
  138. foreach (UnityEngine.Object assetObj in allAssetsOperationHandle.AllAssetObjects)
  139. {
  140. T t = assetObj as T;
  141. dictionary.Add(t.name, t);
  142. }
  143. allAssetsOperationHandle.Release();
  144. return dictionary;
  145. }
  146. }
  147. }