Unity之协程

Unity之协程老早就对Unity这个功能产生了强烈的好奇,今天就要把这块骨头给啃了。目前我对协程的理解相当于有点像线程,但它实际上不是线程。话不多说先来个代码给个初印象:一、开启协程:我在Unity下创建了一个Cube(随便什么物体都行),然后把我的cs文件挂载上去。点击Unity上的开始按钮,运行:代码如下:usingSystem.Collections;usingSystem…

大家好,又见面了,我是你们的朋友全栈君。

老早就对Unity这个功能产生了强烈的好奇,今天就要把这块骨头给啃了。


目前我对协程的理解相当于有点像线程,但它实际上不是线程。话不多说先来个代码给个初印象:

一、开启协程:

我在Unity下创建了一个Cube(随便什么物体都行),然后把我的cs文件挂载上去。点击Unity上的开始按钮,运行:

Unity之协程

代码如下:

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

public class TestCoroutine : MonoBehaviour
{
    private GameObject cube;
    // Start is called before the first frame update
    void Start()
    {
        cube = GameObject.Find("Cube");
        Debug.Log(cube.transform.position);
        #region
        StartCoroutine(Test());
        #endregion

    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private IEnumerator Test()
    {
        
        Debug.Log(System.DateTime.Now+" hello");
        yield return new WaitForSeconds(3f);
        Debug.Log(System.DateTime.Now+" world");
    }
}

 

Unity之协程

聪明的你看明白发生什么事情了吗?

1.首先我打印出了Cube的位置,这个没什么作用。就是想缓冲一下,让你看到程序进行到哪一步了。 

2.然后开启了一个协程,这个协程函数是Test(),进入到Test()函数以后,首先打印出了当前系统时间+hello。

3.然后等待了3s,又打印出了当前系统时间+world。(我们也能算出来秒数增加了3s)

总结:yield return 相当于是“停止执行方法,并且下一帧从这里开始”。

我们上面的程序就相当于停止Test()方法,3s以后下一帧开始执行,输出world字符串

那么,联想一下,这个协程程序是否和Unity自带的Update()函数可以共通呢?我们来做个实验,把刚才的代码稍作修改:

private IEnumerator Test()
    {
        
        Debug.Log(Time.time+" hello");
        yield return new WaitForSeconds(0f);
        Debug.Log(Time.time+" world");
    }

在Unity的Console面板上点击显示时间戳:Unity之协程,(为什么不用之前的函数了,因为那个函数显示的时间不够精确)

Unity之协程

聪明的你发现什么了吗?0.02是怎么出来的呢?

 Time.timeUnity之协程

这个属性是显示帧时。因为yield return是等待下一帧执行,而这里又等待了0s,所以我们从第一帧到下一帧开始用了0.02s,这也是默认的Unity每帧更新的时间:0.02s

不信的话,我们用Update()来验证一下(以下是疯狂打脸时间):

void Update()
    {
        Debug.Log(Time.frameCount+" "+Time.time);
        
    }

Unity之协程

挠头,由以上验证过程可以看出Update()每帧的时间并不是完全一样,那么怎么解释呢?

(参考博客:https://blog.csdn.net/book_longssl/article/details/40150839)

Unity之协程

感谢博主给出了详细的解释,让我也明白了Update()和FixedUpdate()的区别。

二、停止协程

既然有开,那么就有关咯。话不多说,先上代码:

void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space))
        {
            StopCoroutine(Test());
            Debug.Log("已停止协程");
        }
        
    }

Unity之协程

当然了,如果在程序中开始的协程是字符串形式,那么结束也应该是字符串形式:

Unity之协程

 


有些注意事项:

1.多个协程可以同时运行,它们会根据各自的启动顺序来更新

2.协程不是线程,它们运行在同一线程中,跟普通的脚本一样。

3.目前Unity中没有简便的方法来检测作用于对象的协程数量以及具体是哪些协程作用在对象上。

 

emm,好像没什么要说的了。后续有什么想法再补充。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151810.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Protostuff开发

    Protostuff开发Protostuff开发作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs五、Protostuff用法1、为Java实体产生schemasio.protostuffprotostuff-core<

    2022年5月2日
    33
  • 微信小程序个人心得「建议收藏」

    微信小程序个人心得「建议收藏」昨天看了一下微信小程序官方文档,总结一下自己学习的个人心得.首先从官方文档给的框架说起,微信小程序官方文档给出了app.js,app.json,app.wxss.先从这三个文件说起.app.js这个文件是整个小程序的入口文件,开发者的逻辑代码在这里面实现,同时在这个文件夹里面可以定义全局变量.app.json这个文件可以对小程序进行全局配置,决定页面文件的路径,窗口表现,设置网络超时时间

    2025年12月13日
    3
  • r软件的下载与安装_R语言怎么安装

    r软件的下载与安装_R语言怎么安装一、R软件下载下载地址:https://cran.r-project.org/图1R软件下载页面下载之后是.exe执行文件,不是zip压缩格式文件,可以直接点击安装。二、R软件安装过程一直向下执行,直到安装完毕。最后一步是设置系统环境变量:三、Rstudio下载及安装过程下载地址:https://www.rstudio.com/products/rstudio/downl…

    2022年4月19日
    82
  • kali更新官方源「建议收藏」

    kali更新官方源「建议收藏」打开kali自带火狐浏览器,打开kalidocs书签页;搜索source打开第一个搜索内容,点击readmore找到官方源复制进/etc/apt/sources.list打开source.list命令:gedit/etc/apt/sources.list使用apt-getupdate命令更新软件列表。使用apt-getupgrade命令更新软件使…

    2022年5月28日
    60
  • 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…

    正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程…当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一:强制重新启动电脑(长按电源键然后再按一下),然后会有好多项选择,第一项一般是“正常启动”最后一项是“最后一次正确配置”,选择“最后一次正确配置”(有的电脑可能提…

    2022年6月14日
    112
  • MySQL 添加索引,删除索引及其用法[通俗易懂]

    MySQL 添加索引,删除索引及其用法[通俗易懂]原文:https://www.cnblogs.com/zz-tt/p/6609828.html一.索引的作用一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响…

    2022年6月2日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号