第十八章 Unity 协程

这篇具有很好参考价值的文章主要介绍了第十八章 Unity 协程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们知道脚本都是继承自MonoBehaviour类,而其中的Update方法里面放置了大部分的游戏逻辑处理代码。Update方法是游戏循环的每一帧都去执行,这就要求我们的代码“无时无刻”不在处理所有的可能发生的情况,并做出相应的处理。如果我们想要完成“一段时间”的逻辑代码,例如在游戏中发射一颗子弹,这个过程相对于游戏无限循环的时间来说,非常的短暂,如果我们在Update中去完成这样的逻辑,需要根据时间来进行判断,显然这个完成过程非常的复杂。这个时候,Unity给我们提供了协程,从字面意义上理解就是协助程序的意思,类似于“线程”,帮助我们在主任务进行的同时,需要一些分支任务配合工作来达到最终的效果。但是,协程不是线程,协程依旧是在主线程中进行。Unity中的协程由协程函数和协程调度器两部分构成。通过关键字IEnumerator来定义一个协程(迭代方法),然后再程序中通过StartCoroutine来开启一个协程。

接下来,我们创建一个“SampleScene8”的新创景,然后创建一个“Cube”和一个“CubeCoroutine.cs”的脚本文件,并将他们附加在一起。接下来,我们就在脚本文件中定义一个协程方法,如下所示

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeCoroutine : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
        // 按下空格键
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 启动协程
            StartCoroutine("MoveTest");
        }
    }

    // 定义协程方法
    IEnumerator MoveTest()
    {
        transform.Translate(new Vector3(1, 0, 0));
        yield return null;

        transform.Translate(new Vector3(1, 0, 0));
        yield return null;
    }
}

在上面的代码中,我们使用IEnumerator MoveTest来定义协程方法,方法名称为MoveTest。在协程方法中,我们让Cube沿X轴移动两次,每次移动1个单位长度。然后我们在Update方法中监听空格键的按下,使用StartCoroutine方法来启动协程,方法参数就是协程方法名称。接下来我们就Play当工程,查看运行效果

第十八章 Unity 协程

当我们按下一次空格的时候,Cube会移动两次,每次移动1个单位长度,由于代码执行太快,因此我们看不到两次移动之间的间隔。但是从Inspector检视面板中的X数值可以看到,我们每次按下空格的时候,Cube的确是移动了两个单位的长度。

第十八章 Unity 协程

当然,这样简单的代码并不能展示协程的强大之处。我们先从协程方法里面的return解释一下。在普通方法里面,我们经常使用return方法来返回方法的执行的结果值,但是在协程方法里面,这个return并不是返回结果值。上文代码中的“yield return null;”表示暂停协程等待下一帧继续执行。这样的返回设计,让我们能够控制在指定数量的帧中来执行不同的代码,而不是在所有的帧中执行复杂的条件代码。什么意思呢?

        transform.Translate(new Vector3(1, 0, 0));
        yield return null;

        transform.Translate(new Vector3(1, 0, 0));
        yield return null;

我们的协程方法执行后,会在Update方法中执行transform.Translate(new Vector3(1, 0, 0))代码,也就是让Cueb沿X轴移动1个单位的距离。然后使用yield return null停止协程方法等待下一次Update方法。下一次Update方法执行后,就会执行协程中第二个transform.Translate(new Vector3(1, 0, 0))代码,继续让Cueb沿X轴移动1个单位的距离。然后使用yield return null停止协程方法。至此,协程方法执行完毕。

我们回头思考一下发射子弹的协程该如何实现呢?当我们按下空格键代表发射动作的时候,我们可以启动一个子弹飞行协程,在这个协程方法中,我们可以根据指定的速度和射程来移动子弹,协程结束也就代表子弹的飞行逻辑结束。但是,这个需要借助精确的时间来实现。此时,我们可以借助使用“yield return new WairForSeconds(时间);”来表示等待规定时间后继续执行,这样让我们从时间角度出发来执行我们的代码,而不用考虑他们到底在那一帧中去执行。我们稍微改动我们的代码。

    // 定义协程方法
    IEnumerator MoveTest()
    {
        transform.Translate(new Vector3(1, 0, 0));
        //yield return null;
        yield return new WaitForSeconds(1.0f);

        transform.Translate(new Vector3(1, 0, 0));
        yield return null;
    }

说白了,我们让两次移动间隔1秒钟。接下来,我们在来Play当前工程,查看运行效果

第十八章 Unity 协程

这次当我们按下空格键的时候,两次移动之间由于间隔了1秒钟,因此我们看的比较清楚了。从左边的Inspector检视视图中我们也能够看到X从0变到1,再变到2的过程了。接下来,我们回到子弹发射的问题上来。注意,子弹的速度我们可以固定为一个数值,然后射击的距离也可以固定为一个数值。那么,在那个时间点,子弹飞行到哪里,我们就能够计算出来了。如果觉得1秒钟不精确的话,我们可以减小这个时间,这样子弹位置的更新就比较连续了。最后,协程方法也可以定义形参,那么在使用StartCoroutine调用的时候,可以不使用字符串而直接调用方法。代码如下:

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(ParamTest(100));
    }

    // 定义包含参数的协程方法
    IEnumerator ParamTest(int x)
    {
        Debug.Log(x);
        yield return null;
    }

运行结果如下:

第十八章 Unity 协程

注意:可以使用 StopCoroutine 和 StopAllCoroutines 来停止协程。 当用 SetActive(false) 禁用某个协程所附加到的游戏对象时,该协程也将停止。调用 Destroy销毁游戏对象时候,也会停止自身的协程。但通过在 MonoBehaviour 实例上将 enabled 设置为 false 来禁用 MonoBehaviour 时,协程不会停止。

总结:协程只启动一次。而后Unity会在后续的update中执行协程中的循环体。有多次循环,就会在多少次update去分别执行循环体代码。说白了,协程就是将一个过程化的行为分解到了update方法中执行。Unity中的协程可以有两种用途:第一,延迟调用;第二,分解操作,把一个过程分解执行。例如,敌人死亡后淡出消失,改变材质颜色透明度即可,让透明度由1变成0,这是一个过程,可以使用协程来实现。再比如,我们可以通过协程进行寻路A点,B点,C端(巡逻)。其实现方式就是协程嵌套协程,一个协程完成从一个点A移动到另一个点B后,本协程结束后再开启下一个协程,然后从当前点B在继续移动到下一个点C。

本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id文章来源地址https://www.toymoban.com/news/detail-448795.html

到了这里,关于第十八章 Unity 协程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 华为HCIE课堂笔记第十八章 SR技术

    SR可以通过控制器实现集中算路,并根据业务的不同下发不同的路径给到头端设备,头端设备将路径标签通过标签栈的形式压入到报文中,沿途的设备不需要维护路径信息,仅按照标签栈中的栈顶进行报文转发即可。 控制平面:扩展后的IGP协议,通过IGP分发标签 转发平面:基

    2024年02月19日
    浏览(39)
  • Hotspot源码解析-第十八章-元空间的创建与分配

    元空间就是从C堆中划出来的一片完整的区域,为了提升元数据的内存分配效率,又把元空间按若干个chunk内存块管理起来,其中chunk块又分为已使用和空间两种类型,并分别用VirtualSpaceList和ChunkManager来管理,chunk内存块之间以链表的形式关联起来,同时为了满足不同元数据占

    2024年02月01日
    浏览(48)
  • Docker第十八章 : 构建您的第一个Java镜像

    第十八章 : 构建您的第一个Java镜像 本章知识点: 介绍构建java镜像的基本步骤,以及如何通过阿里云效和阿里云容器镜像服务,构建您的第一个Java镜像。 导读 Java入门指南教您如何使用Docker创建容器化的Spring Boot应用程序。在本模块中,您将学习如何: 使用Maven克隆并运行

    2024年02月22日
    浏览(52)
  • 第十八章_Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透

    缓存预热 缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据。 可以通过@PostConstruct初始化白名单数据 缓存雪崩 发生  redis主机挂了,Redis 全盘崩溃

    2024年02月07日
    浏览(44)
  • 斯坦福 Stats60:21 世纪的统计学:第十五章到第十八章

    原文: statsthinking21.github.io/statsthinking21-core-site/comparing-means.html 译者:飞龙 协议:CC BY-NC-SA 4.0 我们已经遇到了许多情况,我们想要询问样本均值的问题。在本章中,我们将更深入地探讨我们可以比较不同组均值的各种方法。 我们可能想要询问均值是否具有特定值的最简单的

    2024年01月16日
    浏览(48)
  • C++ Primer第五版_第十八章习题答案(11~20)

    练习18.11 为什么 what 函数不应该抛出异常? what中如果抛出异常,需要try catch捕获,再调用what,一直循环,直达内存耗尽。 练习18.12 将你为之前各章练习编写的程序放置在各自的命名空间中。也就是说,命名空间chapter15包含Query程序的代码,命名空间chapter10包含TextQuery的代码

    2024年02月06日
    浏览(43)
  • 【Rust】Rust学习 第十八章模式用来匹配值的结构

    模式是 Rust 中特殊的语法,它用来匹配类型中的结构,无论类型是简单还是复杂。结合使用模式和  match  表达式以及其他结构可以提供更多对程序控制流的支配权。模式由如下一些内容组合而成: 字面值 解构的数组、枚举、结构体或者元组 变量 通配符 占位符 这些部分描

    2024年02月11日
    浏览(43)
  • Go学习第十八章——Gin日志与第三方工具Logrus

    1.1 快速入门 在使用Gin框架的过程中,日志是一个重要的组成部分,它可以记录框架和应用程序的运行情况,帮助开发者排查问题和监控应用程序的性能。Gin框架提供了方便的方法来设置和使用日志。 默认日志 Gin框架默认使用的是标准库的log包,将日志输出到控制台。可以通

    2024年02月07日
    浏览(40)
  • 第十八章 SPFA算法以及负环问题(利用dijkstra推导出该算法,超级详细!!)

    我们回顾一下之前的dijkstra算法的证明过程。如果大家没看过之前的dijkstra算法的简易证明的话,作者在这里建议先去看一下。 传送门: 第十六章 Dijkstra算法的讲解以及证明(与众不同的通俗证明) 那么假设你已经看过这篇文章,我们发现,我们将每次松弛操作后的最小距离

    2024年02月02日
    浏览(50)
  • 第二十八章 Unity射线检测

    本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线,在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标;又可以判断鼠标是否指向游戏物体。射线的创建方式,一般使用代码来实现。接下来,我

    2024年02月11日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包