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

文章目录

  • [InvokeRepeating Invoke CancelInvoke](#InvokeRepeating Invoke CancelInvoke)
  • Coroutine
    • [1. 使用协程(Coroutine)实现类似Invoke的延迟调用:](#1. 使用协程(Coroutine)实现类似Invoke的延迟调用:)
    • [2. 要使用协程(Coroutine)来实现类似于`InvokeRepeating`的重复调用效果](#2. 要使用协程(Coroutine)来实现类似于InvokeRepeating的重复调用效果)
    • [3. 区别](#3. 区别)
    • [4. 补充](#4. 补充)
  • 完结

InvokeRepeating Invoke CancelInvoke

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

  1. 使用InvokeRepeating方法实现重复调用:
csharp 复制代码
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方法实现延迟调用:
csharp 复制代码
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方法取消调用:
csharp 复制代码
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)实现延迟调用:

csharp 复制代码
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语句来控制协程的执行间隔。下面是一个示例:

csharp 复制代码
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. 补充

javascript 复制代码
# 开始协程:
private Coroutine myCoroutine;
myCoroutine = StartCoroutine(MyCoroutine());

# 停止协程:
StopCoroutine(myCoroutine);

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

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

完结

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

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

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

相关推荐
PieroPc4 分钟前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439693 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna3 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
异次元的归来4 小时前
Unity DOTS中的share component
unity·游戏引擎
Dream_Snowar4 小时前
速通Python 第三节
开发语言·python
高山我梦口香糖5 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
信号处理学渣5 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
jasmine s6 小时前
Pandas
开发语言·python