计时器管理类:
using UnityEngine;
using System.Collections;using System.Collections.Generic;
using System;
public class TimeCounterManager : MonoBehaviour
{
private static TimeCounterManager instance;
public static TimeCounterManager Instance
{
get
{
if (instance == null)
{
instance = new GameObject("TimeCounterManager").AddComponent<TimeCounterManager>();
}
return instance;
}
}
public List<TimeCounter> timeCounters;//计时器列表
public int timeCounterID;//每个计时器ID 累加
public List<int> removeIDs;
void Awake()
{
instance = this;
timeCounters = new List<TimeCounter>();
timeCounterID = 0;
removeIDs = new List<int>();
}
/// <summary>
/// 添加一个计时器
/// </summary>
public void AddTimeCounter(float lastTime, Action callBack)
{
TimeCounter timeCounter = new TimeCounter(timeCounterID++, lastTime, callBack);
timeCounters.Add(timeCounter);
}
/// <summary>
/// 移除一个计时器
/// </summary>
/// <param name="id"></param>
public void RemoveTimeCounter(int id)
{
removeIDs.Add(id);
}
void RemoveTimeCounter()
{
foreach (var item in removeIDs)
{
for (int i = 0; i < timeCounters.Count; i++)
{
if (timeCounters[i].id == item)
{
timeCounters.RemoveAt(i);
break;
}
}
}
removeIDs.Clear();
}
/// <summary>
/// 修改一个计时器
/// </summary>
/// <param name="id"></param>
/// <param name="lastTime"></param>
public void UpdateTimeCounter(int id, float lastTime)
{
TimeCounter temTimer = GetItem(id);
if (temTimer != null)
temTimer.lastTime += lastTime;
else
Debug.LogError("计时器为空____" + id);
}
/// <summary>
/// 查找一个计时器
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public TimeCounter GetItem(int id)
{
for (int i = 0; i < timeCounters.Count; i++)
{
if (timeCounters[i].id == id)
{
return timeCounters[i];
}
}
return null;
}
/// <summary>
/// 设置计时器状态 开启还是关闭
/// </summary>
public void SetTimeCounterState(int id, bool state)
{
for (int i = 0; i < timeCounters.Count; i++)
{
if (timeCounters[i].id == id)
{
timeCounters[i].isStopTimer = true;
break;
}
}
}
/// <summary>
/// 计时
/// </summary>
void Tick()
{
for (int i = 0; i < timeCounters.Count; i++)
timeCounters[i].Tick();
}
void Update()
{
Tick();
}
}
/// <summary>
/// 计时器类
/// </summary>
public class TimeCounter
{
public int id;//计时器ID
public bool isActive;//计时器是否激活
public float lastTime;//计时时间
public float timer;//计时
public bool isStopTimer;//是否停止计时器
public Action callBack;
public TimeCounter(int _id,float _lastTime,Action _callBack)
{
id = _id;
lastTime = _lastTime;
callBack = _callBack;
isActive = true;
timer = 0;
}
public void Tick()
{
if (isStopTimer) return;
timer += Time.deltaTime;
if (isActive && timer >= lastTime)
{
callBack.Invoke();
TimeCounterManager.Instance.RemoveTimeCounter(id);
}
}
}