在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,
不断的读取任务,可以设定一个固定时间来读取任务