您的位置:首页 > 理论基础 > 计算机网络

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

2014-04-18 13:03 302 查看
在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,

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面向对象 设计