抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

继续写新的博客,生活也要敢于迈出新的步伐,博客内容参考雨松大大的《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来启动或取消协程任务

评论