unity协程 Start/StopCoroutine() 结束协程和再次启动协程存在的问题和解决方案

这篇具有很好参考价值的文章主要介绍了unity协程 Start/StopCoroutine() 结束协程和再次启动协程存在的问题和解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

仅用于记录遇到的问题和解决方案。

快速阅览:

一、结束协程无效:协程方法需要单独存一份private IEnumerator myTest,再开始和结束不直接传入方法名,而是使用这份保存的myTest进行开始和结束。

二、再次开启协程时少跑了几行代码:再次开始同一个方法名的协程时,不是从第一句代码开始执行,而是从上次结束的位置执行,所以如果需要初始化状态,应该单独调用该方法。

详细说明:

启动协程使用StartCoroutine();传入需要使用携程的方法名

具体代码段如下,假设使用协程时需要先初始化部分游戏状态。

public class Controller: MonoBehaviour
{
    private void start()
    {
        StartCoroutine(Test());
    }
    
    IEnumerator Test()
    {
        InitState();

        while(true)
        {
            DoSomething;
            yield return new WaitForSeconds(1);
        }
        
    }

    private void InitState()
    {
        DoSomething;
    }
}

结束携程StopCoroutine(); 直接传入方法名是不可以结束协程的,需要按如下操作记录协程地址,然后再传入Stop方法中。

private IEnumerator myTest;
myTest = Test();
StartCoroutine(myTest);
StopCoroutine(myTest);

最后如果还需要再启动协程,会发现这次代码段没有执行初始化游戏状态的代码,他会接着上次被停止的地方执行,所以初始化状态不应该写在协程内部,而是写在协程外。

完整代码如下

unity 停止协程,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-607124.html

public class Controller: MonoBehaviour
{
    private IEnumerator myTest;

    private void start()
    {
        myTest = Test();
        
        InitState();    // 手动初始化状态
        StartCoroutine(myTest);
    }
    
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            StopCoroutine(myTest);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            InitState();    // 初始化状态写在协程开始之前
            StartCoroutine(myTest);
        }
    }

    IEnumerator Test()
    {
        while(true)
        {
            DoSomething;
            yield return new WaitForSeconds(1);
        }
        
    }

    private void InitState()
    {
        DoSomething;
    }
}

到了这里,关于unity协程 Start/StopCoroutine() 结束协程和再次启动协程存在的问题和解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • go的协程和管道运用案例

    2024年01月19日
    浏览(30)
  • 浅谈Lua协程和函数的尾调用

    虽然不经常用到协程,但是也不能谈虎色变。同时,在有些场景,协程会起到一种不可比拟的作用。所以,了解它,对于一些功能,也会有独特的思路和想法。 概念 关于进程和线程的概念就不多说。 那么从多线程的角度来看,协程和线程有点类似:拥有自己的栈,局部变量

    2024年02月10日
    浏览(36)
  • 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统

    使用了标准库头文件 setjmp.h 中的 setjmp 和 longjmp 两个函数,构建了一个简单的查询式协作多任务系统,支持 独立栈 和 共享栈 两种任务。 其中涉及到获取和设置栈的地址操作,因此还需要根据不同平台提供获取和设置栈的地址操作(一般是汇编语言,因为涉及到寄存器) 该

    2024年02月19日
    浏览(38)
  • 使用C++20协程和io_uring优雅地实现异步IO

    距离2020年已经过去很久了,各大编译器对于C++20各项标准的支持也日趋完善,无栈协程也是其中之一,所以我就尝试着拿协程与 io_uring 实现了一下proactor模式,这篇文章用来记录一下我的设计和想法。除此之外,我们能在网络上找到许多优秀的C++20协程的教程以及许多优秀的

    2024年03月27日
    浏览(37)
  • Kotlin 如何确定协程是否启动

    在Kotlin中,你可以确定协程是否已启动并正在运行,可以使用 Job接口 来管理协程,并使用一些函数来检查协程的状态。以下是一些常见的方法: 1.launch 函数返回一个 Job 对象,可以使用这个对象来确定协程的状态。例如: 在上面的示例中,isActive 函数用于检查协程是否处于

    2024年02月08日
    浏览(23)
  • 记录由于未关闭加速器就关机而导致的再次启动后DNS配置错误

    先直接给出解决方案: cmd输入 netsh winsock reset 这段时间在同学的推荐下入坑了鹅鹅鸭(Goose Goose Duck),一款紧张刺激的狼人杀类型的游戏。如果想顺畅的进行游戏,则需要使用加速器。 不久问题出现了:在周六上午和周二上午两次在教学楼打开电脑都发现没有网络,第一次

    2024年02月11日
    浏览(31)
  • Unity的AssetBundle资源运行内存管理的再次深入思考

      大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我猜很多朋友都存在一定的疑惑。疑惑的点有非常多,包

    2024年03月22日
    浏览(25)
  • systemctl start jenkins启动失败

    参照官网安装jenkins: https://pkg.jenkins.io/redhat-stable/ 安装完成后通过 systemctl start jenkins 命令启动, 失败 使用提示的 systemctl status jenkins.service 命令查看详细状态: 网上大多都说是jdk路径问题和jdk版本不符。而我换了很多版本,路径也加上了安装路径依然无法解决systemctl 启动的问

    2024年01月20日
    浏览(27)
  • Kotlin: 协程的四种启动模式(CoroutineStart)

    点击查看CoroutineStart英文文档 创建协程的三种方式 runBlocking 运行一个协程并且会阻塞当前线程,直到它完成。 launch 启动一个新的协程,不会阻塞当前线程,并且返回一个Job,可以取消。 async async和await是两个函数,这两个函数在我们使用过程中一般都是成对出现的。 async用

    2024年04月23日
    浏览(40)
  • Unity 协程 Unity Task UniTask

    使用 StartCoroutine 和 IEnumerator yield return null 暂停执行并随后在下一帧恢复 yield return new WaitForSeconds(1f); 延迟1秒 waitfor系列有好几个 WaitForSeconds 和 WaitForSecondsRealtime 的区别 使用缩放时间将协程执行暂停指定的秒数。 实际暂停时间等于给定时间除以 Time.timeScale。如果要使用未缩放

    2024年02月08日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包