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