【Unity】協(xié)程重寫Invoke·InvokeRepeating·SendMessage

在使用unity自帶的invoke這個東西的時候,老怕找不到指定的名字,或者是指定名字不能用之類的,用著一點都不放心,正好今天也沒有太多事,就去研究了一下,看到了傳說中的協(xié)成,之前對這個東西都是淺淺的認為他就是一個延時的工具,今天去看了好久,還是覺得是一個延時的工具,哈哈。進入正題吧。

Invoke
/// <summary>
/// 注冊執(zhí)行方法,在timer秒后執(zhí)行acition
/// </summary>
public static void Invoke(MonoBehaviour monoBehaviour, Action action, float timer)
{
    monoBehaviour.StartCoroutine(DoAction(action, timer));
}  

/// <summary>
/// 在timer秒后執(zhí)行方法
/// </summary>
private static IEnumerator DoAction(Action action, float timer)
{
    yield return new WaitForSeconds(timer);
    action.Invoke();
}
InvokeRepeating

這里也可以傳值,把回調(diào)寫成帶值的就可以了。

/// <summary>
///     注冊重復(fù)執(zhí)行方法,在timer秒后執(zhí)行acition并在每duration后再次執(zhí)行,如果要停下來,返回值需要記錄下。
/// </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>
///     執(zhí)行重復(fù)調(diào)用
/// </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>
///     停止重復(fù)執(zhí)行的攜程
/// </summary>
public static void StopRepeat(MonoBehaviour monoBehaviour, IEnumerator iEnumerator)
{
    monoBehaviour.StopCoroutine(iEnumerator);
}
SendMessage

這里只寫了一個參數(shù)的,多個參數(shù)的是一樣的寫法。

/// <summary>
///     注冊執(zhí)行方法向方法中傳值obj,在timer秒后執(zhí)行acition
/// </summary>
public static void Invoke<T>(MonoBehaviour monoBehaviour, Action<T> action, T obj, float timer)
{
    monoBehaviour.StartCoroutine(DoAction(action, obj, timer));
}

/// <summary>
///     在timer秒后執(zhí)行方法
/// </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執(zhí)行");
}

private void print(int num)
{
    Debug.Log("我是invoke執(zhí)行帶值" + num);
}
運行結(jié)果

差不多就是這樣子的了,具體的代碼在這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容