- 最后登录
- 2016-8-29
- 注册时间
- 2012-8-25
- 阅读权限
- 90
- 积分
- 23585
- 纳金币
- 20645
- 精华
- 62
|
我在代码中使用的混用方法,设置一个空的状态,让它在循环的时候跳到空的状态中 但是不做任何事情
这样就能实现混用,减少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更好的使用?)
可能是我做得不够彻底,得出的结果是它们的性能几乎一致(求大神论证)
|
|