Unity3d 协程的注意问题(新手须注意,老手须加勉)
关于unity3d的协程,非常的好用,比如等待几秒执行,等待下一帧执行等!
但是也有潜在的问题:
1.协程是单线程的,在主线程中完成
2.如果发现yield, 那么这一帧会结束,那么等下一帧调用此脚本的时候继续执行!
如果同一个协程方法被两个方法在相对短的时间内都进行调用,那么就会出现逻辑上的错误!这个时候需要用锁来锁定!
我举例如下:
using UnityEngine;
using System.Collections;
public class YieldScpipt : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void RunContinue()
{
StartCoroutine(run());
}
IEnumerator run()
{
print("1");
//yield return 0;
print("2");
//yield return 0;
print("3");
yield return 0;
}
}
在另一个类中用Test方法进行调用
public class Test : MonoBehaviour {
public YieldScpipt ys;
// Use this for initialization
void Start () {
for(int i=0;i<3;i++)
{
ys.RunContinue();
}
}
// Update is called once per frame
void Update () {
}
}
那么会打印如下:1,2,3,1,2,3.。。。预期的顺序
如果把注释去掉
IEnumerator run()
{
print("1");
yield return 0;
print("2");
yield return 0;
print("3");
yield return 0;
}
那么打印的顺序就不能保证了,这就是我遇到的问题!
当然,我不是用for循环这样引起的,我是不经意间写错了逻辑,导致在很短的时间内,这个方法被两次或者多次调用,导致了逻辑错误!
有什么问题请指出!欢迎与广州老龙联系!
Unity3d 协程的注意问题(新手须注意,老手须加勉)的更多相关文章
- Unity3D协程yield的理解
Unity3D的协程概括地将就是:对于一段程序,你可以加上yield标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码.协程的作用:①延迟一段时间执行代码.②等某个操作完成之后再执行 ...
- [转]Unity3D协程介绍 以及 使用
作者ChevyRay ,2013年9月28日,snaker7译 原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...
- Unity3D协程
协程介绍 Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器.这一点你不必关注太多,我们直接进入一个简单的例子来看看协程到底能干什么.首 ...
- Unity3D协程介绍 以及 使用
作者ChevyRay ,2013年9月28日,snaker7译 原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协 ...
- Unity3D协程(转)
这篇文章转自:http://blog.csdn.net/huang9012/article/details/38492937 协程介绍 在Unity中,协程(Coroutines)的形式是我最喜欢的功 ...
- Unity3D 协程 浅谈
协程 理解:协程不是线程,也不是异步执行(知道就行). 1.协程和MonoBehaviour的Update函数一样,也是在MainThread中执行的(一定得明白这句话意思). void Start ...
- Unity3d 协程
参考文章: http://blog.csdn.net/onafioo/article/details/48979939 http://www.cnblogs.com/zhaoqingqing/p/37 ...
- Unity3D 协程 Coroutine
协程(Coroutine)的概念存在于很多编程语言,例如Lua.ruby等.而由于Unity3D是单线程的,因此它同样实现了协程机制来实现一些类似于多线程的功能,但是要明确一点协程不是进程或线程,其执 ...
- Unity3D 协程的介绍和使用
我是快乐的搬运工 http://blog.csdn.net/u011397120/article/details/61236055 ---------------------------------- ...
随机推荐
- 转:what is TWO_TASK
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:89412348059 You Asked what is t ...
- 关于Modelsim仿真速度的优化
如果在不需要波形,只需要快速知道结果的情况下,可以用优化选项.这适用于做大量case的仿真阶段.因为这一阶段多数case都是通过的,只需要快速确认即可,然后把没通过的case拿出来做全波形的仿真调试. ...
- Bootstrap--组件之下拉菜单
用于显示链接列表的可切换.有上下文的菜单. 对齐 B默认情况下,下拉菜单自动沿着父元素的上沿和左侧被定位为 100% 宽度. 为 .dropdown-menu 添加 .dropdown-menu-ri ...
- sea.js 学习
开篇:终于学习了sea.js的使用了,因为它是一个模块加载工具,所以首先要了解javascript的模块编程,然后对sea.js的了解和使用 javascript 模块编程 为什么要模块化编程,为了让 ...
- c3p0配置文件报错 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
原配置文件: 异常截图: 百度可知: 在xml的配置文件中 :要用 & 代替 更改后配置文件:
- zoj 1649 Rescue (BFS)(转载)
又是类似骑士拯救公主,不过这个是朋友拯救天使的故事... 不同的是,天使有多个朋友,而骑士一般单枪匹马比较帅~ 求到达天使的最短时间,杀死一个护卫1 units time , 走一个格子 1 unit ...
- UVA 11549 CALCULATOR CONUNDRUM(Floyd判圈算法)
CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She was bore ...
- Demo_张仕传_结构体考试-modify
/* 题目: //声明一个结构体类型 struct _AdvTeacher { char *name; char *tile; int age; char *addr; char *p1; //系统预 ...
- 现代密码学应用的范例-PGP
PGP(Pretty Good Privacy),是一个基于RSA公钥加密体系的邮件加密软件. 产生背景: 电子邮件在传输中使用SMTP协议存在这样的问题 1.无法保证邮件在传输过程中不被人偷看 2. ...
- Spark-Cassandra-Connector 插入数据函数saveToCassandra
在spark-shell中将数据保存到cassandra: var data = normalfill.map(line => line.split("\u0005")) d ...