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 ---------------------------------- ...
随机推荐
- 开源安全测试 - BackTrack的应用
开源安全测试 - BackTrack的应用: http://gdtesting.com/product.php?id=99
- Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志
在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...
- javascript-03
1.Object |-1.var 变量=new Object(); |-变量.自定义的属性='值'; |-变量.自定义名称=function(){} |-2.var ...
- jquery基础-包裹 替换 删除 复制
<!doctype html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Unity3D 之武器系统冷却功能的实现方式
先上方法 //如果Fire1按钮被按下(默认为ctrl),每0.5秒实例化一发子弹 public GameObject projectile; public float fireRate = 0.5F ...
- Unity3D 之UGUI 图片
这里来降价下Unity3Dl的图片 先创建一个图片 图片的属性 Preserve Aspect -->保持图片的原始宽高比例 Set native Size -->图片原始尺寸 Image ...
- 关于.NET前后台提示框的那点事
前言 关于提示框,或多或少都用到过,提示框常见方式两种:js原生alert() 和 div模拟弹层:下面以一个常见的需求业务场景来展现提示框的那点事: 正文内容 客户:需求方: 小白:实现方(全权负责 ...
- (转) ASP.NET页面缓存
原文:http://www.cnblogs.com/Sky_KWolf/archive/2010/12/05/1897158.html 静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的 ...
- Oracle start with.connect by prior子句实现递归查询
Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... fr ...
- WPF动画之关键帧动画(2)
XAML代码: <Window x:Class="关键帧动画.MainWindow" xmlns="http://schemas.microsoft.com/win ...