美文网首页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

    在使用unity自带的invoke这个东西的时候,老怕找不到指定的名字,或者是指定名字不能用之类的,用着一点都不放...

  • XLua里使用协程

    在XLua里如何使用协程?有两种方式 使用Unity协程要想通过unity的StartCoroutine使用协程,...

  • Unity 协程

    unity 里面的协程流程 开始协程 StartCoroutine("DoSomething"); 执行到 yie...

  • Unity3D Invoke 方法的调用

    遇到需要间隔一段时间再来调用的情况,如果不想用协程,可以使用Invoke()实现。 如: Invoke("Send...

  • C#协程

    Unity中协程的执行原理 UnityGems.com给出了协程的定义: A coroutine is a fun...

  • unity协程

    今天在网上看见一个人的博客,发现对unity Coroutine有深入的了解分享一下 原文出处 unity Mo...

  • Unity3D 协程管理

    Unity里面的协程好用,但总是在如何关闭指定协程,尤其是关闭带参数的协程的问题上困惑不已。在本文,笔者带你用最简...

  • 自定义协程模块

    IFramework所有模块总目录 简介 协程在unity中很常见,IF中也有自己的协程。其本质就是通过:yiel...

  • Unity3d-仿写简单dotween C#扩展方法协程单例工厂

    dotween官网 先验知识:Unity3d-Coroutines协程 Unity3d-C#扩展方法 dotwee...

  • Unity之协程

    协程,又称微线程,纤程。英文名Coroutine。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B...

网友评论

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

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