unity协程,频繁调用时,只执行最后一次

设计了一个延迟机制,用于让一个延迟执行的动作,在一定时间内被频繁调用时,只执行最后一次。

知识点

简单介绍一下,协程的停止方法 StopCoroutine。对于一个普通的协程

// 定义
IEnumerator AABB() 
{
    while(true) {
        // do sth.
        yield return null;
    }
}
// 调用
StartCoroutine(AABB()); 或 StartCoroutine("AABB");
// 停止
StopCoroutine(AABB()); 或 StopCoroutine("AABB");

当有参数时变成

// 定义
IEnumerator AABB(string str)
{
    while(true) {
        // do sth.
        yield return null;
    }
}

// 调用
// 有参数时,不能使用函数名的字符串 StartCoroutine("AABB")方式调用了
Coroutine aabb = StartCoroutine(AABB("123"));

// 停止
// 调用时传入参数为"123",
// 但是执行 StopCoroutine("123")并不能停下该协程
StopCoroutine(aabb);

案例

public string log;
Coroutine async;
float threshold; //时间阈值,小于该时间,则只执行后一次

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        if(async != null)
        {
            Debug.Log("停下上一个: " + log);

            // 如果在指定时间内,有新的操作,取消上一个协程
            StopCoroutine(async);
        }

        log = "www" + Random.Range(0, 100);

        async = StartCoroutine(DelayedAction(log));
    }
}

IEnumerator DelayedAction(string content)
{      
    yield return new WaitForSeconds(threshold);

    Debug.Log("success >> " + content);

    async = null;
}

你可能感兴趣的:(unity3d)