unity一个利用协程写的时间工具,经过很多次使用

45 篇文章 0 订阅

using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Test : MonoBehaviour

{

       void Start()

       {

              //UtilDtime.DelayExecute("test1",5,()=>Debug.Log(10));

              //UtilDtime.DelayExecute("test2", 5, () => Debug.Log(20));

              //UtilDtime.DelayExecuteParams("test3", 5,(obj)=> { S(obj); 
},"s",false,1);

              HelpDTimeManager.Instance.FirstCallNumber("test4", 1, 20, () => 
Debug.Log(1));

       }

       void Update()

       {

              if (Input.GetMouseButtonDown(0))

              {

                     HelpDTimeManager.Instance.StopByNameIE("test4");

              }

       }

       void S(params object[] obj)

       {

              Debug.Log(obj[1]);

       }

}

public class HelpDTimeManager : MonoBehaviour

{

       public delegate void DTimeCallParams(params object[] objs);

       private Dictionary<string, Coroutine> CoroutineDic = new Dictionary<string, 
Coroutine>();

       public static HelpDTimeManager Instance;

       public void Awake()

       {

              Instance = this;

       }

       /// <summary>

       /// 延迟执行

       /// </summary>

       /// <param name="name">协程名</param>

       /// <param name="seconds">秒数</param>

       /// <param name="callfunc">方法</param>

       public void DelayExecute(string name, float seconds, Action callfunc)

       {

              Coroutine c = StartCoroutine(Excute(seconds, callfunc));

              CoroutineDic.Add(name, c);

       }

       static IEnumerator Excute(float seconds, Action callfunc)

       {

              yield return new WaitForSeconds(seconds);

              callfunc();

       }

       public void DelayExecuteParams(string name, float seconds, DTimeCallParams 
callfunc, params object[] objs)

       {

              Coroutine c = StartCoroutine(ExcuteParams(seconds, callfunc, objs));

              CoroutineDic.Add(name, c);

       }

       static IEnumerator ExcuteParams(float seconds, DTimeCallParams callfunc, 
params object[] objs)

       {

              yield return new WaitForSeconds(seconds);

              callfunc(objs);

       }

       /// <summary>

       /// 初始调用,每个多少时间调用一次 一共调用多少次

       /// </summary>

       /// <param name="interval">间隔时间</param>

       /// <param name="callfunc">方法</param>

       /// <param name="count">次数</param>

       public void FirstCallNumber(string name, float interval, int count, Action 
callfunc)

       {

              Coroutine c = StartCoroutine(IIntervalCall(interval, callfunc, 
count));

              CoroutineDic.Add(name, c);

       }

       static IEnumerator IIntervalCall(float interval, Action callfunc, int 
count)

       {

              if (count > 0)

              {

                     while (count > 0)

                     {

                           count--;

                           callfunc();

                           yield return new WaitForSeconds(interval);

                     }

              }

              else

              {

                     while (true)

                     {

                           callfunc();

                           yield return new WaitForSeconds(interval);

                     }

              }

       }

       /// <summary>

       /// 初始不调用,每个多少时间调用一次 一共调用多少次

       /// </summary>

       /// <param name="interval">间隔时间</param>

       /// <param name="callfunc">方法</param>

       /// <param name="count">次数小于0 永久调用</param>

       public void CallNumber(string name,float interval, int count, Action 
callfunc)

       {

              Coroutine c = StartCoroutine(FirstIIntervalCall(interval, callfunc, 
count));

              CoroutineDic.Add(name, c);

       }

       static IEnumerator FirstIIntervalCall(float interval, Action callfunc, int 
count)

       {

              if (count > 0)

              {

                     while (count > 0)

                     {

                           count--;

                           callfunc();

                           yield return new WaitForSeconds(interval);

                     }

              }

              else

              {

                     while (true)

                     {

                           callfunc();

                           yield return new WaitForSeconds(interval);

                     }

              }

       }

       /// <summary>

       /// 停止协程

       /// </summary>

       /// <param name="name">协程名</param>

       public void StopByNameIE(string name)

       {

              if (CoroutineDic.ContainsKey(name))

              {

                     StopCoroutine(CoroutineDic[name]);

              }

              else

              {

                     Debug.LogError("不包含" + name);

              }

       }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值