- 最后登录
- 2018-12-19
- 注册时间
- 2012-8-20
- 阅读权限
- 90
- 积分
- 54706
- 纳金币
- 32328
- 精华
- 41
|
我在代码中使用的混用方法,设置一个空的状态,让它在循环的时候跳到空的状态中 但是不做任何事情
这样就能实现混用,减少update中使用等待时间之类的代码行数...
Update()
{
if(gameState == GameState.game)
{
....
if(Input.GetMouseDown(1)) {
gameState = GameState.wait
StartCoroutine( RoleAttack( ) ); //此时Update仍在执行,不过跳到了GameState.wait中,所以什么也没做
//RoleAttack 也正确的执行了并且只执行了一次,正确的等待了2秒
}
....
}
else if(gameState == GameState.wait)
{
//do nothing
}
}
IEnumerator RoleAttack()
{
.....
yield return new WaitForSeconds(2);
//最后记得改变状态回来
gameState = GameState.game ; // 跳回循环中
}
我的感觉:
1使用协同程序写游戏的Loop,特别是涉及到等待时间相关的,协同程序的代码量相当少,使程序更容易维护
2 使用Update() 来写Loop 是一种习惯 -,- 是一种流水线形式的处理,是一种从上古的c++遗留下来的优良传统orz...
3 使用协同程序时 比较复杂的时候,程序逻辑难以读懂(智商太低orz)
4 千万不要这样写:
Update() {
//没有任何状态机就跑协同
StartCoroutine( Test( ) );
//恭喜你每一帧都开了一个协同程序,如果你不怕死机的话
}
——————————————————————————
另外:我做了一个协同程序和Update的性能测试, 我猜测使用协同时 图片的读取效率 更好(GPU更好的使用?)
可能是我做得不够彻底,得出的结果是它们的性能几乎一致(求大神论证)
更多精彩内容,尽在web3D纳金网http://www.narkii.com/club/
【来源:unity圣典】 |
|