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);
}
}
}