ResourcesComponent.cs 5.9 KB

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