106 lines
3.0 KiB
C#
106 lines
3.0 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using System.Collections;
|
|||
|
using UnityEngine;
|
|||
|
using UnityEngine.Events;
|
|||
|
|
|||
|
// 用来为AssetUpdateDownloader提供计时更新的工具
|
|||
|
// 这个全游戏绝对存在的实例,因此用他探测是否结束游戏
|
|||
|
public class AssetUpdateDownloaderTick : MonoBehaviour
|
|||
|
{
|
|||
|
public static AssetUpdateDownloaderTick instance;
|
|||
|
public event UnityAction onUpdate;
|
|||
|
private readonly List<DownloadTimer> _timers = new List<DownloadTimer>();
|
|||
|
/// <summary>
|
|||
|
/// 是否游戏已经退出,处理一些关闭时调用OnDestroy产生的报错
|
|||
|
/// </summary>
|
|||
|
public static bool applicationQuit { get; private set; }
|
|||
|
public static void CreateInstance()
|
|||
|
{
|
|||
|
if (!instance)
|
|||
|
{
|
|||
|
var gameObject = new GameObject("AssetUpdateDownloaderTick");
|
|||
|
instance = gameObject.AddComponent<AssetUpdateDownloaderTick>();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private void Awake()
|
|||
|
{
|
|||
|
DontDestroyOnLoad(gameObject);
|
|||
|
}
|
|||
|
|
|||
|
private void OnApplicationQuit()
|
|||
|
{
|
|||
|
applicationQuit = true;
|
|||
|
}
|
|||
|
|
|||
|
#region Load Stream Asset - 加载配置表等非AssetBundle资源
|
|||
|
public delegate void LoadStreamAssetCallBack(WWW www);
|
|||
|
|
|||
|
public void LoadStreamingAsset(string uri, LoadStreamAssetCallBack callBack)
|
|||
|
{
|
|||
|
uri = Application.streamingAssetsPath.Open(uri);
|
|||
|
#if UNITY_EDITOR || !UNITY_ANDROID
|
|||
|
uri = "file://" + uri;
|
|||
|
#endif
|
|||
|
StartCoroutine(LoadWWW(uri, callBack));
|
|||
|
}
|
|||
|
|
|||
|
private static IEnumerator LoadWWW(string uri, LoadStreamAssetCallBack callBack)
|
|||
|
{
|
|||
|
var www = new WWW(uri);
|
|||
|
yield return www;
|
|||
|
if (!string.IsNullOrEmpty(www.error))
|
|||
|
Debug.LogError("Load streaming assets error: " + www.error + "\n" + uri);
|
|||
|
if (callBack != null)
|
|||
|
callBack(www);
|
|||
|
www.Dispose();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
private void LateUpdate()
|
|||
|
{
|
|||
|
if (onUpdate != null)
|
|||
|
onUpdate();
|
|||
|
for (var i = _timers.Count - 1; i >= 0; i--)
|
|||
|
{
|
|||
|
var timer = _timers[i];
|
|||
|
if (Time.realtimeSinceStartup > timer.time)
|
|||
|
{
|
|||
|
_timers.RemoveAt(i);
|
|||
|
if (timer.callback != null)
|
|||
|
timer.callback.Invoke();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public DownloadTimer AddTimer(float delay, UnityAction callback)
|
|||
|
{
|
|||
|
var timer = _timers.Find(a => a.callback == callback);
|
|||
|
if (timer == null)
|
|||
|
{
|
|||
|
timer = new DownloadTimer(callback);
|
|||
|
_timers.Add(timer);
|
|||
|
}
|
|||
|
timer.time = Time.realtimeSinceStartup + delay;
|
|||
|
return timer;
|
|||
|
}
|
|||
|
|
|||
|
public void RemoveTimer(UnityAction callback)
|
|||
|
{
|
|||
|
var i = _timers.FindIndex(a => a.callback == callback);
|
|||
|
if (i >= 0)
|
|||
|
_timers.RemoveAt(i);
|
|||
|
}
|
|||
|
|
|||
|
public class DownloadTimer
|
|||
|
{
|
|||
|
public readonly UnityAction callback;
|
|||
|
public float time;
|
|||
|
|
|||
|
public DownloadTimer(UnityAction callback)
|
|||
|
{
|
|||
|
this.callback = callback;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|