在MonoBehavior类中有一个方法是StartCoroutine。里面要求的是一个接口为IEnumerator协同的返回值,

在Unity3d中,协同的作用是马上返回结果的。而不影响其它程序的运行,并非一直在等待协同的结果返回

你能够在协同程序内使用yiled来等待当前的程序运行完成。

然后再往程序的以下的代码运行。

使用协同的优点不是堵塞游戏线程的运行,可以让游戏流畅。

使用弱连网的游戏,我简易的封装了一个工具类,这样非常方便的进行网络数据的处理,

思路是一个半单例的模式,对外不开放,对本类进行对象创建。一个静态工厂方法+单例。

当然,里面还有非常多不足。对于一般的弱连网的游戏来说。已经够用了

using UnityEngine;
using System.Collections; public class Task { // 任务的优生等级
enum Advance {
Low = -1,
Normal,
Advance
} // 任务的类型
enum TaskType {
Netwowk = -77,
Local,
Message
} /// <summary>
/// 当前任务列表,任务的读取形式是先进后出
/// </summary>
BetterList<Task> ts; /// <summary>
/// 任务的单例
/// </summary>
private static Task instance;
public static Task Instance {
get
{
if(instance == null) {
instance = new Task();
}
return instance;
}
} public void StopIEnumerator () {
if (instance != null) {
instance = null;
ts = null;
}
} private Task () {
ts = new BetterList<Task> ();
ts.Clear ();
} /// <summary>
/// Initializes a new instance of the <see cref="Task"/> class.
/// </summary>
/// <param name="id">Identifier.</param>
/// <param name="param">Parameter.</param>
private Task(int id, object param) {
this.id = id;
this.param = param;
} /// <summary>
/// Creates the new task.
/// </summary>
/// <returns><c>true</c>, if new task was created, <c>false</c> otherwise.</returns>
/// <param name="id">Identifier.</param>
/// <param name="param">Parameter.</param>
public bool CreateNewTask(int id, object param) {
Task t = new Task (id, param);
ts.Add (t); return true;
} /// <summary>
/// The identifier.
/// </summary>
public int id; /// <summary>
/// The parameter.
/// </summary>
public object param; void addTask(Task t) {
if (t.id > 0) {
ts.Add (t);
}
} public IEnumerator doTask() { Debug.Log ("Size:" + ts.size);
//Debug.Log (RealTime.time);
if(ts.size > 0) { Task t = ts.Pop(); switch (t.id) {
case 77:
Debug.Log("ID:"+t.id+"TASK:"+t.param);
WWW www = new WWW("http://www.baidu.com");
yield return www;
//网络请求完毕后进行数据的分发
Debug.Log("www" + www.text);
// NGUITools.Broadcast();-> LocalDispatch
break;
case 88:
Debug.Log("ID:"+t.id+"TASK:"+t.param);
break;
case 99:
Debug.Log("ID:"+t.id+"TASK:"+t.param);
break;
default:
break; } // 不断的读取当前任务,直接任务所有完毕
//if(ts.size > 0) {
// Debug.Log("doTask");
// doTask();
//}
} //else {
// 当前没有任务时。等待3.5s
Debug.Log (RealTime.time);
//yield return new WaitForSeconds (3.5f);
//doTask();
//}
} }

这样,在须要有网络请求的地方。创建当前一实例,然后再创建一个新任务。启动unity3d的loop,

不断的读取任务。能够设定一个固定时间来读取任务



最新文章

  1. SSH集成开发框架开发步骤
  2. Lintcode Perfect Squares
  3. Centos 部署Keepalive高可用软件
  4. Codeforces Round #213 (Div. 2) A. Good Number
  5. qq临时会话代码修改
  6. LA 3907 Puzzle
  7. byte[] 与字符串转换
  8. git问题 next fetch will store in remotes/origin
  9. mysql 出现Duplicate entry ‘xxx’ for key ‘PRIMARY’,一个自增字段达到了上限,
  10. Python基础之元组
  11. django的闪现和增、删、改、查
  12. 前后端数据交互处理基于原生JS模板引擎开发
  13. CocoaPods 添加WebP失败解决办法
  14. electron+react
  15. apacheTomcat
  16. C# 读取Excel和DBF文件
  17. Python内置函数之isinstance,issubclass
  18. uva-10050-模拟水题
  19. go语言基础之多个defer执行顺序
  20. ABP 学习问题集锦

热门文章

  1. apue.h文件找不到的解决办法
  2. linux常用命令系列
  3. logback.xml
  4. shell 实现mysql写入操作
  5. Linux下vi命令小结
  6. 在linux下安装配置rabbitMQ详细教程
  7. PHP中钩子函数的实现与认识
  8. 百度富文本编辑器UEditor报【类型&quot;Uploader&quot;同时存在】错误
  9. java算法-数学之美一
  10. RequireJS禁止缓存