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 _timers = new List(); /// /// 是否游戏已经退出,处理一些关闭时调用OnDestroy产生的报错 /// public static bool applicationQuit { get; private set; } public static void CreateInstance() { if (!instance) { var gameObject = new GameObject("AssetUpdateDownloaderTick"); instance = gameObject.AddComponent(); } } 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; } } }