美文网首页Unity教程合集unity3D技术分享征服Unity3d
【Unity】协程重写Invoke·InvokeRepeatin

【Unity】协程重写Invoke·InvokeRepeatin

作者: 黒可乐 | 来源:发表于2016-12-12 23:45 被阅读0次

    在使用unity自带的invoke这个东西的时候,老怕找不到指定的名字,或者是指定名字不能用之类的,用着一点都不放心,正好今天也没有太多事,就去研究了一下,看到了传说中的协成,之前对这个东西都是浅浅的认为他就是一个延时的工具,今天去看了好久,还是觉得是一个延时的工具,哈哈。进入正题吧。

    Invoke
    /// <summary>
    /// 注册执行方法,在timer秒后执行acition
    /// </summary>
    public static void Invoke(MonoBehaviour monoBehaviour, Action action, float timer)
    {
        monoBehaviour.StartCoroutine(DoAction(action, timer));
    }  
    
    /// <summary>
    /// 在timer秒后执行方法
    /// </summary>
    private static IEnumerator DoAction(Action action, float timer)
    {
        yield return new WaitForSeconds(timer);
        action.Invoke();
    }
    
    InvokeRepeating

    这里也可以传值,把回调写成带值的就可以了。

    /// <summary>
    ///     注册重复执行方法,在timer秒后执行acition并在每duration后再次执行,如果要停下来,返回值需要记录下。
    /// </summary>
    public static IEnumerator InvokeRepeat(MonoBehaviour monoBehaviour, Action action, float timer, float duration)
    {
        var temp = DoRepeat(action, timer, duration);
        monoBehaviour.StartCoroutine(temp);
        return temp;
    }
    
    /// <summary>
    ///     执行重复调用
    /// </summary>
    private static IEnumerator DoRepeat(Action action, float timer, float duration)
    {
        yield return new WaitForSeconds(timer);
        while (true)
        {
            action.Invoke();
            yield return new WaitForSeconds(duration);
        }
    }
    
    StopRepeat
    /// <summary>
    ///     停止重复执行的携程
    /// </summary>
    public static void StopRepeat(MonoBehaviour monoBehaviour, IEnumerator iEnumerator)
    {
        monoBehaviour.StopCoroutine(iEnumerator);
    }
    
    SendMessage

    这里只写了一个参数的,多个参数的是一样的写法。

    /// <summary>
    ///     注册执行方法向方法中传值obj,在timer秒后执行acition
    /// </summary>
    public static void Invoke<T>(MonoBehaviour monoBehaviour, Action<T> action, T obj, float timer)
    {
        monoBehaviour.StartCoroutine(DoAction(action, obj, timer));
    }
    
    /// <summary>
    ///     在timer秒后执行方法
    /// </summary>
    private static IEnumerator DoAction<T>(Action<T> action, T obj, float timer)
    {
        yield return new WaitForSeconds(timer);
        action.Invoke(obj);
    }
    
    客户端
    private IEnumerator coroutine;
    
    public void OnGUI()
    {
        if (GUILayout.Button("Invoke"))
        {
            InvokeTool.Invoke(this, print, 1);
        }
        if (GUILayout.Button("Invoke T"))
        {
            InvokeTool.Invoke(this, print, 2, 1);
        }
        if (GUILayout.Button("InvokeRepeat"))
        {
            coroutine = InvokeTool.InvokeRepeat(this, print, 1, 1);
        }
        if (GUILayout.Button("StopRepeat"))
        {
            InvokeTool.StopRepeat(this, coroutine);
        }
    }
    
    private void print()
    {
        Debug.Log("我是invoke执行");
    }
    
    private void print(int num)
    {
        Debug.Log("我是invoke执行带值" + num);
    }
    
    运行结果

    差不多就是这样子的了,具体的代码在这里

    相关文章

      网友评论

        本文标题:【Unity】协程重写Invoke·InvokeRepeatin

        本文链接:https://www.haomeiwen.com/subject/rigmmttx.html