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


相关推荐

  • Verycd网站中不能显示下载网址的解决办法[通俗易懂]

    Verycd网站中不能显示下载网址的解决办法[通俗易懂]在verycd.com搜索资源的时候,有时候一些权利资源会出现“该内容尚未提供权利证明,无法提供下载”的版权声明。当你急着找这些资源的话,出现这个问题肯定非常烦人的,那该如何解决呢?方法其实很简单。方法0:安装浏览器Verycd链接显示的插件火狐的插件地址(安装这个插件后,可以直接在verycd上看到下载地址):https://addons.mozilla.org/zh-TW/fire

    2022年8月10日
    8
  • 什么是字节码指令?[通俗易懂]

    什么是字节码指令?[通俗易懂]字节码指令简介: Java虚拟机的指令由一个字节长度的、代表着某种特定含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作码。由于限制了Java虚拟机操作码的长度为一个字节,所以指令集的操作码总数不可能超过256条。字节码与数据…

    2022年10月7日
    2
  • c语言中system函数怎么用_system函数的返回值

    c语言中system函数怎么用_system函数的返回值C语言中如何使用system函数一.system函数c语言中的system()函数主要用于发出一个DOS命令,该函数已经收录在标准c库中,可以直接调用。使用时包含头文件<stdlib.h>补充:DOS:DOS是DiskOperatingSystem的缩写,即磁盘操作系统。它是一个基于磁盘管理的操作系统。DOS命令:是指DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。(学习DOS命令是控制微机的基础)提供用户使用的

    2022年9月15日
    2
  • unity3d的入门教程_Unity3D缺点

    unity3d的入门教程_Unity3D缺点Unity3D新手入门初级教程U3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。可发布游戏至Windows、Mac、Wii、iPhone、Windowsphone8和Android平台。也可以利用Unitywebplayer插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Macwidgets所支持!U3D现已经占领了国内85%的手游

    2022年8月10日
    6
  • 我为什么放弃Go语言

    我为什么放弃Go语言我为什么放弃Go语言?有好几次,当我想起来的时候,总是会问自己:这个决定是正确的吗?是明智和理性的吗?其实我一直在认真思考这个问题。开门见山地说,我当初放弃Go语言,就是因为两个“不爽”:第一,对Go语言本身不爽;第二,对Go语言社区里的某些人不爽。毫无疑问,这是非常主观的结论,但是我有足够详实的客观的论据。

    2022年6月30日
    23
  • WIN10系统 Indirect Display 虚拟显示器之特殊应用

    WIN10系统 Indirect Display 虚拟显示器之特殊应用byfanxiushu2020-05-20转载或引用请注明原始作者。有人询问我是否可以实现这样一种功能:对windows输出的每一帧图像数据显示做一些特殊处理(比如球形桌面,曲面化等特效),然后再显示到显示器上。而且还不止一个人这样咨询过,虽然我不大清楚这种需求具体用在何处,估计也是一些特殊场所。这种需求,最先想到的,也最直观的想法就是能否给显卡驱动添加一个过滤驱动,然后拦截图像数据,然后再做些特殊处理。可惜想法是美好的,却是难以实现的,甚至是不大可能实现的。首先windows中就没显卡过

    2022年8月21日
    6

发表回复

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

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