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

来源:互联网 发布:java asm demo 编辑:程序博客网 时间:2024/04/27 17:32

在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();-> LocalDispatchbreak;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.5sDebug.Log (RealTime.time);//yield return new WaitForSeconds (3.5f);//doTask();//}}}


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

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





0 0
原创粉丝点击