123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 loyalsoft. All rights reserved.
- // Homepage: http://www.game7000.com/
- // Feedback: http://www.game7000.com/
- //------------------------------------------------------------
- using GameFramework.Resource;
- using System;
- using System.Collections;
- using UnityEngine;
- #if UNITY_5_4_OR_NEWER
- using UnityEngine.Networking;
- #endif
- using UnityEngine.SceneManagement;
- namespace UnityGameFramework.Runtime
- {
- /// <summary>
- /// 默认资源辅助器。
- /// </summary>
- public class DefaultResourceHelper : ResourceHelperBase
- {
- /// <summary>
- /// 直接从指定文件路径加载数据流。
- /// </summary>
- /// <param name="fileUri">文件路径。</param>
- /// <param name="loadBytesCallbacks">加载数据流回调函数集。</param>
- /// <param name="userData">用户自定义数据。</param>
- public override void LoadBytes(string fileUri, LoadBytesCallbacks loadBytesCallbacks, object userData)
- {
- StartCoroutine(LoadBytesCo(fileUri, loadBytesCallbacks, userData));
- }
- /// <summary>
- /// 卸载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <param name="unloadSceneCallbacks">卸载场景回调函数集。</param>
- /// <param name="userData">用户自定义数据。</param>
- public override void UnloadScene(string sceneAssetName, UnloadSceneCallbacks unloadSceneCallbacks, object userData)
- {
- #if UNITY_5_5_OR_NEWER
- if (gameObject.activeInHierarchy)
- {
- StartCoroutine(UnloadSceneCo(sceneAssetName, unloadSceneCallbacks, userData));
- }
- else
- {
- SceneManager.UnloadSceneAsync(SceneComponent.GetSceneName(sceneAssetName));
- }
- #else
- if (SceneManager.UnloadScene(SceneComponent.GetSceneName(sceneAssetName)))
- {
- if (unloadSceneCallbacks.UnloadSceneSuccessCallback != null)
- {
- unloadSceneCallbacks.UnloadSceneSuccessCallback(sceneAssetName, userData);
- }
- }
- else
- {
- if (unloadSceneCallbacks.UnloadSceneFailureCallback != null)
- {
- unloadSceneCallbacks.UnloadSceneFailureCallback(sceneAssetName, userData);
- }
- }
- #endif
- }
- /// <summary>
- /// 释放资源。
- /// </summary>
- /// <param name="objectToRelease">要释放的资源。</param>
- public override void Release(object objectToRelease)
- {
- AssetBundle assetBundle = objectToRelease as AssetBundle;
- if (assetBundle != null)
- {
- assetBundle.Unload(true);
- return;
- }
- /* Unity 当前 Resources.UnloadAsset 在 iOS 设备上会导致一些诡异问题,先不用这部分
- SceneAsset sceneAsset = objectToRelease as SceneAsset;
- if (sceneAsset != null)
- {
- return;
- }
- Object unityObject = objectToRelease as Object;
- if (unityObject == null)
- {
- Log.Warning("Asset is invalid.");
- return;
- }
- if (unityObject is GameObject || unityObject is MonoBehaviour)
- {
- // UnloadAsset may only be used on individual assets and can not be used on GameObject's / Components or AssetBundles.
- return;
- }
- Resources.UnloadAsset(unityObject);
- */
- }
- private void Start()
- {
- }
- private IEnumerator LoadBytesCo(string fileUri, LoadBytesCallbacks loadBytesCallbacks, object userData)
- {
- bool isError = false;
- byte[] bytes = null;
- string errorMessage = null;
- DateTime startTime = DateTime.UtcNow;
- #if UNITY_5_4_OR_NEWER
- UnityWebRequest unityWebRequest = UnityWebRequest.Get(fileUri);
- #if UNITY_2017_2_OR_NEWER
- yield return unityWebRequest.SendWebRequest();
- #else
- yield return unityWebRequest.Send();
- #endif
- #if UNITY_2020_2_OR_NEWER
- isError = unityWebRequest.result != UnityWebRequest.Result.Success;
- #elif UNITY_2017_1_OR_NEWER
- isError = unityWebRequest.isNetworkError || unityWebRequest.isHttpError;
- #else
- isError = unityWebRequest.isError;
- #endif
- bytes = unityWebRequest.downloadHandler.data;
- errorMessage = isError ? unityWebRequest.error : null;
- unityWebRequest.Dispose();
- #else
- WWW www = new WWW(fileUri);
- yield return www;
- isError = !string.IsNullOrEmpty(www.error);
- bytes = www.bytes;
- errorMessage = www.error;
- www.Dispose();
- #endif
- if (!isError)
- {
- float elapseSeconds = (float)(DateTime.UtcNow - startTime).TotalSeconds;
- loadBytesCallbacks.LoadBytesSuccessCallback(fileUri, bytes, elapseSeconds, userData);
- }
- else if (loadBytesCallbacks.LoadBytesFailureCallback != null)
- {
- loadBytesCallbacks.LoadBytesFailureCallback(fileUri, errorMessage, userData);
- }
- }
- #if UNITY_5_5_OR_NEWER
- private IEnumerator UnloadSceneCo(string sceneAssetName, UnloadSceneCallbacks unloadSceneCallbacks, object userData)
- {
- AsyncOperation asyncOperation = SceneManager.UnloadSceneAsync(SceneComponent.GetSceneName(sceneAssetName));
- if (asyncOperation == null)
- {
- yield break;
- }
- yield return asyncOperation;
- if (asyncOperation.allowSceneActivation)
- {
- if (unloadSceneCallbacks.UnloadSceneSuccessCallback != null)
- {
- unloadSceneCallbacks.UnloadSceneSuccessCallback(sceneAssetName, userData);
- }
- }
- else
- {
- if (unloadSceneCallbacks.UnloadSceneFailureCallback != null)
- {
- unloadSceneCallbacks.UnloadSceneFailureCallback(sceneAssetName, userData);
- }
- }
- }
- #endif
- }
- }
|