继续写新的博客,生活也要敢于迈出新的步伐,博客内容参考雨松大大的《Unity3D游戏开发》
定时器的代码以及调用
全代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class WaitTimeManager
{
// 内部类
class TaskBehaviour : MonoBehaviour { }
private static TaskBehaviour m_task;
/// <summary>
/// 构造方法
/// </summary>
static WaitTimeManager()
{
GameObject go = new GameObject("#WaitTimeManager#");
GameObject.DontDestroyOnLoad(go);
m_task = go.AddComponent<TaskBehaviour>();
}
/// <summary>
/// 返回协程任务
/// </summary>
/// <param name="time">等待时间</param>
/// <param name="callback">无参匿名方法</param>
/// <returns></returns>
static IEnumerator Coroutine(float time, UnityAction callback)
{
yield return new WaitForSeconds(time);
if (callback != null) { callback(); }
}
/// <summary>
/// 外部调用启动协程任务
/// </summary>
/// <param name="time">等待时间</param>
/// <param name="callback">无参匿名方法</param>
/// <returns>协程任务</returns>
static public Coroutine WaitTime(float time, UnityAction callback)
{
return m_task.StartCoroutine(Coroutine(time, callback));
}
/// <summary>
/// 取消协程任务
/// </summary>
/// <param name="coroutine">协程</param>
static public void CancelWait(ref Coroutine coroutine)
{
if(coroutine != null)
{
m_task.StopCoroutine(coroutine);
coroutine = null;
}
}
}
调用示例如下:
Coroutine coroutine = WaitTimeManager.WaitTime(5f, delegate {
Debug.Log("等待5s后回调");
});
// 或用lambda表达式
Coroutine coroutine = WaitTimeManager.WaitTime(5f, () => {
Debug.Log("等待5s后");
});
// 取消等待
WaitTimeManager.CancelWait(ref coroutine);
代码详解
我第一次看这个代码的时候,感觉比较奇怪,其实这个代码确实算是比较难以理解,在网上大家也是更加关心功能,我也找不到类似的解析,其实这个代码只是将单例与内部类结合起来以精简代码(我是这么理解的)
/// <summary>
/// 构造方法
/// </summary>
static WaitTimeManager()
{
GameObject go = new GameObject("#WaitTimeManager#"); // 创建一个GameObject
GameObject.DontDestroyOnLoad(go); // 设置为不被销毁
// 添加内部类到GameObject并指定WaitTimeManager中的静态m_task为新建的组件
m_task = go.AddComponent<TaskBehaviour>();
}
我们可以在Hierachy下的DontDestoyOnLoad中找到这个GameObject,并且看到它其中的m_task,之后我们调用的WaitTimeManager中的方法,都是通过这个m_task来启动或取消协程任务