Files
JJBB/Assets/Plugins/Script/AssetUpdate/AssetUpdateDownloaderTick.cs

106 lines
3.0 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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;
}
}
}