using System;
using UnityEngine;
public class TimeManager : MonoSingleton<TimeManager>
{
private float m_Timer;
private int m_Frames = 0;
public void Init() { }
private Action<int> m_TimeCountAction;
public void RegisterTimeCountEvent(Action<int> action)
{
m_TimeCountAction += action;
}
public void UnRegisterTimeCountEvent(Action<int> action)
{
m_TimeCountAction -= action;
}
private void FixedUpdate()
{
m_Frames = m_Frames++;
m_Timer += Time.fixedDeltaTime;
if (m_Timer >= 1f)
{
m_Timer = 0;
if (m_TimeCountAction != null)
{
m_TimeCountAction(1);
}
}
}
}
public class TimeCount
{
private int m_TotalTime;
private int m_CurrentRemainingTime;
private Action m_TimeCountEndEvent;
private Action<int> m_RemainingTimeEvent;
public TimeCount(int totalTime)
{
m_TotalTime = totalTime;
m_CurrentRemainingTime = m_TotalTime;
}
/// <summary>
/// 开始计时
/// </summary>
public void TimeStart()
{
TimeManager.Instance.RegisterTimeCountEvent(TimeReduce);
}
/// <summary>
/// 注册结束事件
/// </summary>
/// <param name="action"></param>
public void RegisterEndEvent(Action action)
{
m_TimeCountEndEvent += action;
}
/// <summary>
/// 卸载结束事件
/// </summary>
/// <param name="action"></param>
public void UnRegisterEndEvent(Action action)
{
m_TimeCountEndEvent -= action;
}
/// <summary>
/// 注册剩余时间事件
/// </summary>
/// <param name="action"></param>
public void RegisterRemainingTimeEvent(Action<int> action)
{
m_RemainingTimeEvent += action;
}
/// <summary>
/// 卸载剩余时间事件
/// </summary>
/// <param name="action"></param>
public void UnRegisterRemainingTimeEvent(Action<int> action)
{
m_RemainingTimeEvent -= action;
}
/// <summary>
/// 获取剩余时间
/// </summary>
/// <returns></returns>
public int GetRemainingTime()
{
return m_CurrentRemainingTime;
}
/// <summary>
/// 获取倒计时的时间
/// </summary>
/// <returns></returns>
public string GetTimeCountTime()
{
int min = m_CurrentRemainingTime / 60;
int second = m_CurrentRemainingTime % 60;
return min.ToString("00") + ":" + second.ToString("00");
}
/// <summary>
/// 获取已用时间
/// </summary>
/// <returns></returns>
public int GetUsedTime()
{
return m_TotalTime - m_CurrentRemainingTime;
}
/// <summary>
/// 减少时间
/// </summary>
/// <param name="time"></param>
private void TimeReduce(int time)
{
m_CurrentRemainingTime -= time;
if (m_RemainingTimeEvent != null)
{
m_RemainingTimeEvent.Invoke(m_CurrentRemainingTime);
}
if (m_CurrentRemainingTime <= 0)
{
m_CurrentRemainingTime = 0;
TimeManager.Instance.UnRegisterTimeCountEvent(TimeReduce);
if (m_TimeCountEndEvent != null)
{
m_TimeCountEndEvent.Invoke();
}
}
}
}
计时器
本文介绍了Unity中实现时间管理和倒计时的两种类:TimeManager和TimeCount。TimeManager负责固定时间间隔的计数,并触发时间事件;TimeCount用于启动倒计时,注册和移除时间结束及剩余时间事件。通过这两个类,开发者可以轻松地在游戏中实现各种时间相关的功能。
摘要由CSDN通过智能技术生成