DefaultResourceHelper.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. using GameFramework.Resource;
  8. using System;
  9. using System.Collections;
  10. using UnityEngine;
  11. #if UNITY_5_4_OR_NEWER
  12. using UnityEngine.Networking;
  13. #endif
  14. using UnityEngine.SceneManagement;
  15. namespace UnityGameFramework.Runtime
  16. {
  17. /// <summary>
  18. /// 默认资源辅助器。
  19. /// </summary>
  20. public class DefaultResourceHelper : ResourceHelperBase
  21. {
  22. /// <summary>
  23. /// 直接从指定文件路径加载数据流。
  24. /// </summary>
  25. /// <param name="fileUri">文件路径。</param>
  26. /// <param name="loadBytesCallbacks">加载数据流回调函数集。</param>
  27. /// <param name="userData">用户自定义数据。</param>
  28. public override void LoadBytes(string fileUri, LoadBytesCallbacks loadBytesCallbacks, object userData)
  29. {
  30. StartCoroutine(LoadBytesCo(fileUri, loadBytesCallbacks, userData));
  31. }
  32. /// <summary>
  33. /// 卸载场景。
  34. /// </summary>
  35. /// <param name="sceneAssetName">场景资源名称。</param>
  36. /// <param name="unloadSceneCallbacks">卸载场景回调函数集。</param>
  37. /// <param name="userData">用户自定义数据。</param>
  38. public override void UnloadScene(string sceneAssetName, UnloadSceneCallbacks unloadSceneCallbacks, object userData)
  39. {
  40. #if UNITY_5_5_OR_NEWER
  41. if (gameObject.activeInHierarchy)
  42. {
  43. StartCoroutine(UnloadSceneCo(sceneAssetName, unloadSceneCallbacks, userData));
  44. }
  45. else
  46. {
  47. SceneManager.UnloadSceneAsync(SceneComponent.GetSceneName(sceneAssetName));
  48. }
  49. #else
  50. if (SceneManager.UnloadScene(SceneComponent.GetSceneName(sceneAssetName)))
  51. {
  52. if (unloadSceneCallbacks.UnloadSceneSuccessCallback != null)
  53. {
  54. unloadSceneCallbacks.UnloadSceneSuccessCallback(sceneAssetName, userData);
  55. }
  56. }
  57. else
  58. {
  59. if (unloadSceneCallbacks.UnloadSceneFailureCallback != null)
  60. {
  61. unloadSceneCallbacks.UnloadSceneFailureCallback(sceneAssetName, userData);
  62. }
  63. }
  64. #endif
  65. }
  66. /// <summary>
  67. /// 释放资源。
  68. /// </summary>
  69. /// <param name="objectToRelease">要释放的资源。</param>
  70. public override void Release(object objectToRelease)
  71. {
  72. AssetBundle assetBundle = objectToRelease as AssetBundle;
  73. if (assetBundle != null)
  74. {
  75. assetBundle.Unload(true);
  76. return;
  77. }
  78. /* Unity 当前 Resources.UnloadAsset 在 iOS 设备上会导致一些诡异问题,先不用这部分
  79. SceneAsset sceneAsset = objectToRelease as SceneAsset;
  80. if (sceneAsset != null)
  81. {
  82. return;
  83. }
  84. Object unityObject = objectToRelease as Object;
  85. if (unityObject == null)
  86. {
  87. Log.Warning("Asset is invalid.");
  88. return;
  89. }
  90. if (unityObject is GameObject || unityObject is MonoBehaviour)
  91. {
  92. // UnloadAsset may only be used on individual assets and can not be used on GameObject's / Components or AssetBundles.
  93. return;
  94. }
  95. Resources.UnloadAsset(unityObject);
  96. */
  97. }
  98. private void Start()
  99. {
  100. }
  101. private IEnumerator LoadBytesCo(string fileUri, LoadBytesCallbacks loadBytesCallbacks, object userData)
  102. {
  103. bool isError = false;
  104. byte[] bytes = null;
  105. string errorMessage = null;
  106. DateTime startTime = DateTime.UtcNow;
  107. #if UNITY_5_4_OR_NEWER
  108. UnityWebRequest unityWebRequest = UnityWebRequest.Get(fileUri);
  109. #if UNITY_2017_2_OR_NEWER
  110. yield return unityWebRequest.SendWebRequest();
  111. #else
  112. yield return unityWebRequest.Send();
  113. #endif
  114. #if UNITY_2020_2_OR_NEWER
  115. isError = unityWebRequest.result != UnityWebRequest.Result.Success;
  116. #elif UNITY_2017_1_OR_NEWER
  117. isError = unityWebRequest.isNetworkError || unityWebRequest.isHttpError;
  118. #else
  119. isError = unityWebRequest.isError;
  120. #endif
  121. bytes = unityWebRequest.downloadHandler.data;
  122. errorMessage = isError ? unityWebRequest.error : null;
  123. unityWebRequest.Dispose();
  124. #else
  125. WWW www = new WWW(fileUri);
  126. yield return www;
  127. isError = !string.IsNullOrEmpty(www.error);
  128. bytes = www.bytes;
  129. errorMessage = www.error;
  130. www.Dispose();
  131. #endif
  132. if (!isError)
  133. {
  134. float elapseSeconds = (float)(DateTime.UtcNow - startTime).TotalSeconds;
  135. loadBytesCallbacks.LoadBytesSuccessCallback(fileUri, bytes, elapseSeconds, userData);
  136. }
  137. else if (loadBytesCallbacks.LoadBytesFailureCallback != null)
  138. {
  139. loadBytesCallbacks.LoadBytesFailureCallback(fileUri, errorMessage, userData);
  140. }
  141. }
  142. #if UNITY_5_5_OR_NEWER
  143. private IEnumerator UnloadSceneCo(string sceneAssetName, UnloadSceneCallbacks unloadSceneCallbacks, object userData)
  144. {
  145. AsyncOperation asyncOperation = SceneManager.UnloadSceneAsync(SceneComponent.GetSceneName(sceneAssetName));
  146. if (asyncOperation == null)
  147. {
  148. yield break;
  149. }
  150. yield return asyncOperation;
  151. if (asyncOperation.allowSceneActivation)
  152. {
  153. if (unloadSceneCallbacks.UnloadSceneSuccessCallback != null)
  154. {
  155. unloadSceneCallbacks.UnloadSceneSuccessCallback(sceneAssetName, userData);
  156. }
  157. }
  158. else
  159. {
  160. if (unloadSceneCallbacks.UnloadSceneFailureCallback != null)
  161. {
  162. unloadSceneCallbacks.UnloadSceneFailureCallback(sceneAssetName, userData);
  163. }
  164. }
  165. }
  166. #endif
  167. }
  168. }