//------------------------------------------------------------
// 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
{
///
/// 默认资源辅助器。
///
public class DefaultResourceHelper : ResourceHelperBase
{
///
/// 直接从指定文件路径加载数据流。
///
/// 文件路径。
/// 加载数据流回调函数集。
/// 用户自定义数据。
public override void LoadBytes(string fileUri, LoadBytesCallbacks loadBytesCallbacks, object userData)
{
StartCoroutine(LoadBytesCo(fileUri, loadBytesCallbacks, userData));
}
///
/// 卸载场景。
///
/// 场景资源名称。
/// 卸载场景回调函数集。
/// 用户自定义数据。
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
}
///
/// 释放资源。
///
/// 要释放的资源。
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
}
}