Skip to content

Proven Unity Timer 是 akbiggs UnityTimer 的实用优化简化版本

License

Notifications You must be signed in to change notification settings

asyncrun/Proven-Unity-Timer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation


Proven Unity TimerGitHub.akbiggs.UnityTimer 的实用优化简化版本。


akbiggs 实现的 UnityTimer 是优秀的Unity计时器


两个版本的主要区别 :

  • 本版本去掉了一些API,比如暂停、取消所有Timer的调用
  • 获得Timer,不再反回Timer对象的引用,而是反回每次使用分配的UseId,UseID每次使用会递增,保持唯一;使用UseId取消Timer,好处是在做GC优化使用对象池时,一个Timer对象不会被多个外部调用引用持有,如果被持有,会被错误取消,造成BUG
  • 使用对象池管理Timer对象,避免频繁分配实例化
  • 增加了流逝时间回调
  • 增加了倒计时回调
  • 增加了每帧回调
  • 测试代码中添加了:中途取消Timer、监听GameObject删除取消Timer、重连时取消、销毁时取消等容易发生错误的测试代码

一些测试代码

using UnityEngine;

public class Main : MonoBehaviour
{
    public void Update()
    {
        TimerManager.Self.OnUpdate(Time.deltaTime);
    }
    
    private GameObject _obj;
    public long _countDownTimerId = 0;
    public long _printTipTimerId = 0;

    public void OnGUI()
    {
        if (GUILayout.Button("等待5秒 打印 Hello"))
        {
            Timer.Wait(
                5, 
                () => Debug.Log("Hello"));
        }


        if (GUILayout.Button("5秒倒计时 打印每秒更新"))
        {
            Timer.CountDown(
                5,
                () => Debug.Log("倒计时结束"),
                second => { Debug.Log(second); });
        }


        if (GUILayout.Button("测试A 5秒倒计时 开始"))
        {
            _countDownTimerId = Timer.CountDown(
                5,
                () => Debug.Log("倒计时结束"),
                second => { Debug.Log(second); });
        }

        if (GUILayout.Button("测试A 5秒倒计时 中途取消"))
        {
            Timer.Cancel(_countDownTimerId);
        }
        

        if (GUILayout.Button("测试A 5秒倒计时 重新开始倒计时"))
        {
            _countDownTimerId = Timer.CountDown(
                5,
                () => Debug.Log("倒计时结束"),
                second => { Debug.Log(second); });
        }

        
        if (GUILayout.Button("测试B Run 开始 创建关注的GameObject"))
        {
            _countDownTimerId = Timer.RunBySecond(
                deltaTime =>{ Debug.Log(deltaTime); },
                _obj = new GameObject("_obj"));
        }


        if (GUILayout.Button("测试B 删除关注的GameObject"))
        {
            DestroyImmediate(_obj);
        }


        if (GUILayout.Button("测试C 循环调用"))
        {
            PrintTip();
        }

        if (GUILayout.Button("测试C 主动取消 循环调用"))
        {
            Timer.Cancel(_printTipTimerId);
        }
    }

    public void PrintTip()
    {
        Timer.Cancel(_printTipTimerId);
        Debug.Log("Tip: HI......");

        _printTipTimerId = Timer.Wait(3, PrintTip);
    }

    public void WhenDeInit()
    {
        Timer.Cancel(_countDownTimerId);
        Timer.Cancel(_printTipTimerId);
    }

    public void WhenReLink()
    {
        Timer.Cancel(_countDownTimerId);
        Timer.Cancel(_printTipTimerId);
    }
}

About

Proven Unity Timer 是 akbiggs UnityTimer 的实用优化简化版本

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages