【unity知识点】实现延迟调用——InvokeRepeating Invoke CancelInvoke Coroutine使用介绍

发布时间:2024年01月02日

InvokeRepeating Invoke CancelInvoke

当需要在Unity中实现延迟调用的功能时,你可以使用InvokeRepeatingInvokeCancelInvoke和协程(Coroutine)来完成。下面是它们的具体示例用法:

  1. 使用InvokeRepeating方法实现重复调用:
using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        InvokeRepeating("MethodName", 2f, 1f);
    }

    void MethodName()
    {
        Debug.Log("Repeatedly called every 1 second");
    }
}

上述示例中,MethodName方法会在启动2秒后开始被重复调用,并且每隔1秒执行一次。

  1. 使用Invoke方法实现延迟调用:
using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        Invoke("MethodName", 3f);
    }

    void MethodName()
    {
        Debug.Log("Delayed method call after 3 seconds");
    }
}

上述示例中,MethodName方法会在启动后延迟3秒进行一次调用。

  1. 使用CancelInvoke方法取消调用:
using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        InvokeRepeating("MethodName", 2f, 1f);
        Invoke("CancelMethod", 5f);
    }

    void MethodName()
    {
        Debug.Log("Repeatedly called every 1 second");
    }

    void CancelMethod()
    {
        Debug.Log("Cancelled the repeating method call");
        CancelInvoke("MethodName");
    }
}

上述示例中,CancelMethod方法会在启动后延迟5秒被调用,并且会取消之前通过InvokeRepeating方法设定的重复调用。

Coroutine

1. 使用协程(Coroutine)实现类似Invoke的延迟调用:

使用协程(Coroutine)实现延迟调用:

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    IEnumerator Start()
    {
        yield return new WaitForSeconds(2f);
        MethodName();
    }

    void MethodName()
    {
        Debug.Log("Delayed method call after 2 seconds");
    }
}

上述示例中,通过使用协程的方式实现了在启动2秒后执行MethodName方法的延迟调用。

以上是使用InvokeRepeatingInvokeCancelInvoke和协程(Coroutine)实现延迟调用的示例。你可以根据具体需求选择最合适的方法来实现你的功能。

2. 要使用协程(Coroutine)来实现类似于InvokeRepeating的重复调用效果

要使用协程(Coroutine)来实现类似于InvokeRepeating的重复调用效果,你可以使用yield return new WaitForSeconds语句来控制协程的执行间隔。下面是一个示例:

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    IEnumerator Start()
    {
        while (true)
        {
            yield return new WaitForSeconds(1f);
            MethodName();
        }
    }

    void MethodName()
    {
        Debug.Log("Repeatedly called every 1 second");
    }
}

上述示例中,Start方法作为协程被启动后,会进入一个无限循环。在每次循环中,通过yield return new WaitForSeconds(1f)语句等待1秒后,再调用MethodName方法。这样就实现了类似于InvokeRepeating方法的重复调用效果。

3. 区别

在某些情况下,协程和Invoke(或InvokeRepeating)方法实现的功能可以相互替代。但是,它们之间存在一些重要的区别。

  1. 语法:协程使用了yield语句来控制代码执行流程,而Invoke方法则直接传递方法名和延迟时间作为参数。

  2. 精度:协程的精度更高,因为它们可以在每一帧之后或者指定的时间间隔之后执行代码。而Invoke方法则受到Unity的帧率限制,可能无法达到非常精准的时间间隔。

  3. 可读性:协程通常比Invoke方法更加可读,因为它们可以使用常规的控制流结构(例如if语句和for循环)来组织代码,而不是依赖回调函数。

  4. 功能:协程在处理复杂的逻辑和异步操作时更加方便。例如,协程可以用于在后台加载资源、等待用户输入、等待网络请求响应等。

综上所述,虽然协程和Invoke方法可以实现类似的效果,但它们在实际应用中有不同的优势和劣势。在选择使用哪种方法时,你需要权衡各种因素,如代码可读性、精度、复杂性等。

4. 补充

# 开始协程:
private Coroutine myCoroutine;
myCoroutine = StartCoroutine(MyCoroutine());

# 停止协程:
StopCoroutine(myCoroutine);

# 停止名为 "Start" 的协程
StopCoroutine("Start");

# 停止当前对象上所有正在运行的协程
StopAllCoroutines();

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_36303853/article/details/135265622
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。