热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于Unity3D协程的使用

开辟线程的方法在Unity里面不是非常好使,如果需要做一些异步操作官方是提供了协程来处理的,但是官方的协程文档写的和没有写一样,这里我想强烈吐槽下不方便截图,给官方的协程文档网址。里面

开辟线程的方法在Unity里面不是非常好使,如果需要做一些异步操作官方是提供了协程来处理的,但是官方的协程文档写的和没有写一样,这里我想强烈吐槽下...

不方便截图,给官方的协程文档网址。里面只告诉怎么用void StartCoroutine(string methodName,object param=null)这个接口的方法,这个方法简单粗暴,直接用函数名字就可以调用那个协程方法了,呵呵.....然而这样坑爹的问题就来了,我之后需要扩展下这个函数,或者别人需要拓展下,然后可能这个函数名也变了....然后编译下,嗯~没有报错,nice,提交上传.....然后过了几天,就发现你写的这个功能死活没用,你觉得不对啊,我就加了几行新的代码而已,没有改变之前的结构,运行也没有报错!!!到底错在哪里...这就是StartCoroutine("XXX")神秘的地方,即使你函数名不对它也不报错 。。(不过还好,新版的我测试了下是有这个找不到协程提示的)。而且在你重构代码的时候,用vs重构函数命名,StartCoroutine里面调用如果是字符串的话,是不会随着重构的,改起来超麻烦,你还要去改StopCoroutine的地方,而且看代码时候想跳转到函数声明的时候,需要你搜索文档去找了....我是极度不推荐这样使用协程的。

然后还剩下一个接口了Coroutine StartCoroutine(IEnumerator routine)可以用了,这个貌似很靠谱,然后停止的接口也非常漂亮的一目了然,就知道怎么用了void StopCoroutine(IEnumerator routine) ,果然还是有编程经验一看就懂,嘿嘿嘿....肯定是先用变量存下StartCoroutine抛出的Coroutine,然后需要停止的时候 就把这个变量丢给StopCoroutine里面去,嗯~~应该是这样,然后写了个测试例子:

using UnityEngine;
using System.Collections;

public class TestCoroutine : MonoBehaviour {
IEnumerator Start () {
Coroutine routine =StartCoroutine(CoroutineForever());
yield return new WaitForSeconds(5);
StopCoroutine(routine);
}

private IEnumerator CoroutineForever(){
while(true){
yield return new WaitForSeconds(1);
print("Test Coroutine");
}
}
}
短短几行代码就实现了异步的每秒输出一个“Test Coroutine” 然后在五秒后停止的例子,协程真实方便啊....

然而惊奇的发现这个例子,在Unity4的版本里面,是不会被停止的!!!刚刚写的时候跑在Unity5里面居然停止了,应该是Unity也发现了...不然返回的这个Coroutine类型对象毫无意义...

然后再贴个靠谱的方法,在 Unity4和Unity5里面都非常好使的,而且方便协程的管理,再也不要用什么函数名了,恨死这东西了,Invoke也是:

using UnityEngine;
using System.Collections;

public class TestCoroutine : MonoBehaviour {

IEnumerator Start () {
IEnumerator routine =CoroutineForever();
StartCoroutine(routine);
yield return new WaitForSeconds(5);
StopCoroutine(routine);
}

private IEnumerator CoroutineForever(){
while(true){
yield return new WaitForSeconds(1);
print("Test Coroutine");
}
}
}
还好,只多了一行代码..

还有提醒下,如果是用StartCoroutine("XXX")的方式调用协程的话,千万一定要记得用StopCoroutine("XXX")的这个对应停止协程,StopCoroutine(IEnumerator routine)是停止不掉的。

另外还有在Unity4里面如果使用了协程的话一定要做管理,因为Unity4的MonoBehavior类没有对协程进行管理,因此在Destroy这个gameobject后,协程还是会被继续执行的,直到这个类被gc掉,所以需要写对协程管理的方法在OnDestroy里面,如果是对象池的话,需要在放入缓存池的时候把协程进行管理,如果不这样做,有可能你在协程里面尝试访问修改一些对象属性,被Destroy后对象属性访问是会报错的,所以所以....千万记得要管理好协程。不过还好Unity5里面已经内部做好这些管理工作了,在对象销毁后,所有协程也会被停止掉,但是如果做的是对象池,还是得老老实实做好协程管理。



推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
author-avatar
的闪客快打
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有