JJBB/Assets/Plugins/Script/AssetUpdate/AssetUpdateDownloaderTick.cs
2024-08-23 15:49:34 +08:00

106 lines
3.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}