做三消项目需要做一个提示用户哪个格子可以消除的功能,需要对整个棋盘进行遍历。

原来没用协程的代码

public void GetTip()
{
GameObject go1, go2;int[] way = { 1, -1, -10, 10 };int max = (xl - 1) * 10 + yl - 1;for (int x = 0; x < xl; x += 2){for (int y = 0; y < yl; y++){int gid = GetGridID(x, y);for (int i = 0; i <= 3; i++){int newGid = gid + way[i];if (newGid <= max && newGid >= 0 && newGid % 10 < yl){Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);if (ComparatorTip(newGid)){go1 = DicGrid[gid].gameObject;go2 = DicGrid[newGid].gameObject;HighLight(go1);HighLight(go2);Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);return;}else Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);}}}}return ;
}

代码很多,只看重点,代码里的二重循环对游戏主循环有很大影响,每次用户点击按钮都要卡一下,但是unity不允许在这种地方用多线程,所以,只能改成协程,让这个功能分几个帧完成,就可以感觉不到卡顿。

修改后的代码

public void GetTipGo(){StartCoroutine("IGetTipGo");}IEnumerator IGetTipGo(){GameObject go1, go2;int[] way = { 1, -1, -10, 10 };int max = (xl - 1) * 10 + yl - 1;for (int x = 0; x < xl; x += 2){for (int y = 0; y < yl; y++){int gid = GetGridID(x, y);for (int i = 0; i <= 3; i++){int newGid = gid + way[i];if (newGid <= max && newGid >= 0 && newGid % 10 < yl){yield return 0;Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);if (ComparatorTip(newGid)){yield return 0;go1 = DicGrid[gid].gameObject;go2 = DicGrid[newGid].gameObject;HightLight(go1);HighLight(go2);Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);StopCoroutine("IGetTipGo");}else Swap(ref DicGrid[newGid].GridType, ref DicGrid[gid].GridType);}}}}StopCoroutine("IGetTipGo");}

用两个yield return 0;将几个比较耗时间的运算用帧分开,原来的return改为StopCoroutine();

这样就可以释放主循环的压力了。

PS:进阶技巧

协程与多线程的结合

参考博客

http://blog.csdn.net/laipixiaoxi/article/details/51890903

简单unity协程优化方案相关推荐

  1. Unity协程简述(简单用法,简易分析)

    Unity协程 协程的简单用法 简述 函数 协程的执行顺序 协程替我们做了什么 Yleid Return 如何进行跳帧,延迟,等待的操作 从IL的角度分析 IL语言 总结 自定义一个迭代器 优化 最后 ...

  2. Unity协程的简单应用

    Unity协程是一种特殊的函数,可以让你在Unity中创建一种类似于多线程的异步操作.它可以在需要等待某个操作完成时,暂停执行当前代码,等待某个条件满足后再继续执行. 在一般情况下 unity中调用函 ...

  3. unity怪物攻击玩家减血_利用Unity协程实现一个简单的怪物寻路与跟随AI

    利用Unity协程实现一个简单的怪物寻路与跟随AI,通过分析怪物行为与逻辑,实现简单的平面怪物寻路与跟随效果. 分析 对于游戏中怪物的行为,简单归纳为如下几部分: 怪物在预设范围内随机移动. 玩家走入 ...

  4. unity 协程特点

    协程 一. Unity中使用协程 1. 什么是协程 2. 如何使用 3. 协程的应用场景 创建补间动画 打字机效果 异步加载资源 4. 注意事项 二. Unity协程的底层原理 1. 协程本体:C#的 ...

  5. 【Unity】Unity协程(Coroutine)的原理与应用

    文章目录 前言 一.什么是协程 二.应用场景 1.异步加载资源 2.将一个复杂程序分帧执行 3.定时器 三.协程的使用 注意事项 四.Unity协程的底层原理 1. 协程本体:C#的迭代器函数 2. ...

  6. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

  7. Unity 协程原理探究与实现

    目录 一.介绍 二.迭代器 三.原理 四.总结 一.介绍 协程Coroutine在Unity中一直扮演者重要的角色.可以实现简单的计时器.将耗时的操作拆分成几个步骤分散在每一帧去运行等等,用起来很是方 ...

  8. Unity 协程深入解析与原理

    先来直接放一段代码 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 p ...

  9. Unity协程实现分析以及Lua协程与Unity协程的混合使用

    1,节选翻译一篇stackoverflow关于Unity协程实现的讨论 - The big clues are in the C# version. Firstly, note that the re ...

最新文章

  1. 端到端对话模型新突破!Facebook发布大规模个性化对话数据库
  2. 程序员自学到底有没有用?网友们吵翻了...
  3. 目前我见过的.net开源的或者免费的比较好的资源
  4. 遍历——PowerShell三分钟(十)
  5. 【互联网本周大事记】Uber估值400亿了呢!
  6. [easyui] 在iframe中操作父窗口的组件
  7. EGOImageView 解析
  8. Js数据类型之——Date
  9. matlab符号函数绘图法_matlab制图—符号函数(显函数、隐函数和参数方程)画图
  10. OLTP与OLAP介绍
  11. 在java中使用关键字导入包_java的import关键字的使用
  12. 使用python实现栈和队列
  13. 不如跳舞!伯克利的舞蹈动作迁移效果逆天
  14. LeetCode8 字符串转整数
  15. Execution failed for task :Test:lintVitalRelease/Lint found fatal errors while assembling a release
  16. python如何输出结果到txt_python 执行结果输出为txt
  17. ISO/IEC 27701:2019(隐私信息安全管理扩展要求和指南)解读(一)
  18. EasyOcr报错 --- [WinError 10054] An existing connection was forcibly closed by the remote host
  19. where和group by能一起使用吗?
  20. 佳能eosr控制环能否计算机控制,镜头不够EF口来凑 佳能EOS R转接性能测试

热门文章

  1. vue 按钮 权限控制
  2. kill -HUP重启mysql_kill的用法
  3. Minio(二) | Minio多用户权限控制
  4. TCL脚本数据文件格式
  5. 华为公布鸿蒙系统发展战略,荣耀先行!华为智慧屏9月发布:搭鸿蒙系统
  6. 2019年1月21日训练
  7. java适合女生学吗_【软帝学院】女生不适合学习java?其实女生学java更有优势,更好就业!...
  8. 常见WEB服务器种类
  9. 7-3 不能用循环是一件多么悲伤的事 (30 分)
  10. Python 数据库连接池