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

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

在Unity3d中,协同的作用是立即返回结果的,而不影响其他程序的执行,并不是一直在等待协同的结果返回

你可以在协同程序内使用yiled来等待当前的程序执行完毕,

然后再往程序的下面的代码执行。使用协同的好处不是阻塞游戏线程的执行,能够让游戏流畅。

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

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

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

[csharp]  view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Task {  
  5.   
  6.     // 任务的优生等级  
  7.     enum Advance {  
  8.         Low = -1,  
  9.         Normal,  
  10.         Advance  
  11.     }  
  12.   
  13.     // 任务的类型  
  14.     enum TaskType {  
  15.         Netwowk = -77,  
  16.         Local,  
  17.         Message  
  18.     }  
  19.   
  20.     /// <summary>  
  21.     /// 当前任务列表,任务的读取形式是先进后出  
  22.     /// </summary>  
  23.     BetterList<Task> ts;  
  24.   
  25.     /// <summary>  
  26.     /// 任务的单例  
  27.     /// </summary>  
  28.     private static Task instance;  
  29.     public static Task Instance {  
  30.         get  
  31.         {  
  32.             if(instance == null) {  
  33.                 instance = new Task();  
  34.             }  
  35.             return instance;  
  36.         }  
  37.     }  
  38.   
  39.     public void StopIEnumerator () {  
  40.         if (instance != null) {  
  41.             instance = null;  
  42.             ts = null;  
  43.         }  
  44.     }  
  45.   
  46.     private Task () {  
  47.         ts = new BetterList<Task> ();  
  48.         ts.Clear ();  
  49.     }  
  50.   
  51.     /// <summary>  
  52.     /// Initializes a new instance of the <see cref="Task"/> class.  
  53.     /// </summary>  
  54.     /// <param name="id">Identifier.</param>  
  55.     /// <param name="param">Parameter.</param>  
  56.     private Task(int id, object param) {  
  57.         this.id = id;  
  58.         this.param = param;  
  59.     }  
  60.   
  61.     /// <summary>  
  62.     /// Creates the new task.  
  63.     /// </summary>  
  64.     /// <returns><c>true</c>, if new task was created, <c>false</c> otherwise.</returns>  
  65.     /// <param name="id">Identifier.</param>  
  66.     /// <param name="param">Parameter.</param>  
  67.     public bool CreateNewTask(int id, object param) {  
  68.         Task t = new Task (id, param);  
  69.         ts.Add (t);  
  70.   
  71.         return true;  
  72.     }  
  73.   
  74.     /// <summary>  
  75.     /// The identifier.  
  76.     /// </summary>  
  77.     public int id;  
  78.   
  79.     /// <summary>  
  80.     /// The parameter.  
  81.     /// </summary>  
  82.     public object param;  
  83.   
  84.     void addTask(Task t) {  
  85.         if (t.id > 0) {  
  86.             ts.Add (t);  
  87.         }  
  88.     }  
  89.   
  90.   
  91.     public IEnumerator doTask() {  
  92.   
  93.         Debug.Log ("Size:" + ts.size);  
  94.         //Debug.Log (RealTime.time);  
  95.         if(ts.size > 0) {  
  96.   
  97.             Task t = ts.Pop();  
  98.   
  99.             switch (t.id) {  
  100.             case 77:  
  101.                 Debug.Log("ID:"+t.id+"TASK:"+t.param);  
  102.                 WWW www = new WWW("http://www.baidu.com");  
  103.                 yield return www;  
  104.                 //网络请求完成后进行数据的分发  
  105.                 Debug.Log("www" + www.text);  
  106.                 // NGUITools.Broadcast();-> LocalDispatch  
  107.                 break;  
  108.             case 88:  
  109.                 Debug.Log("ID:"+t.id+"TASK:"+t.param);  
  110.                 break;  
  111.             case 99:  
  112.                 Debug.Log("ID:"+t.id+"TASK:"+t.param);  
  113.                 break;  
  114.             default:  
  115.                 break;  
  116.               
  117.             }  
  118.   
  119.             // 不断的读取当前任务,直接任务全部完成  
  120.             //if(ts.size > 0) {  
  121.             //  Debug.Log("doTask");  
  122.             //  doTask();  
  123.             //}  
  124.         } //else {  
  125.             // 当前没有任务时,等待3.5s  
  126.         Debug.Log (RealTime.time);  
  127.             //yield return new WaitForSeconds (3.5f);  
  128.             //doTask();  
  129.         //}  
  130.     }  
  131.   
  132.   
  133.   
  134.   
  135. }  


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

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


你可能感兴趣的:(Unity3d 面向对象设计思想(六)(Unity3d网络异步数据))