Unity3d 面向对象设计思想(六)(Unity3d网络异步数据)

在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,

不断的读取任务,可以设定一个固定时间来读取任务






你可能感兴趣的:(面向对象,设计)