ResourcesComponent.cs 5.9 KB

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