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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Soc芯片架构介绍「建议收藏」

    Soc芯片架构介绍「建议收藏」参考链接:https://www.bilibili.com/read/cv3347169/扩展:计算机架构(哈佛结构):参考链接:https://zhuanlan.zhihu.com/p/63322067

    2022年9月7日
    0
  • 浅谈arping

    浅谈arping文件上传漏洞的分析与利用什么是Webshell一句话木马神器中国菜刀利用数据库备份上传webshell利用抓包上传webshellIIS解析漏洞Apache解析漏洞SQL语句执行文件上传漏洞应用总结什么是WebshellWebShell是利用ASP或PHP等语言编写的基于Web的木马后门。通过WebShell可以控制Web站点,包括上传下载文件、查看数据库、执行系统命令等。上传漏洞的利用目…

    2022年6月5日
    38
  • TCP/IP协议详解

    TCP/IP协议详解认识HTTP协议它是互联网协议(InternetProtocolSuite),一个网络通信模型,是互联网的一个基本的构架。HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件…

    2022年6月13日
    33
  • 在小程序/mpvue中使用flyio发起网络请求「建议收藏」

    在小程序/mpvue中使用flyio发起网络请求「建议收藏」Fly.js一个基于Promise的、强大的、支持多种JavaScript运行时的http请求库.有了它,您可以使用一份http请求代码在浏览器、微信小程序、Weex、Node、ReactNative、快应用中都能正常运行。同时可以方便配合主流前端框架,最大可能的实现WriteOnceRunEverywhere。上一篇文章介绍了在快应用中使用flyio,本文主要介绍一下如何在…

    2022年9月7日
    0
  • MYSQLServer2008R2详细的图文安装教程

    MYSQLServer2008R2详细的图文安装教程本文主要总结了在win7系统上安装Mysql_Server2008(64位)的详细图文教程,具体的安装步骤如下所示:MysqlServer2008R2企业版下载地址:(直接打开链接,默认用的是迅雷下载,里面自带序列号)ed2k://|file|cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso|4662884352|1D…

    2022年7月27日
    8
  • Nuke Python脚本读取文件渲染所需要的分辨率

    Nuke Python脚本读取文件渲染所需要的分辨率

    2021年9月8日
    74

发表回复

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

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