Unity3d 面向对象设计思想(六)(Unity3d网络异步数据)
2024-08-22 16:14:20
在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,
不断的读取任务。能够设定一个固定时间来读取任务
最新文章
- SSH集成开发框架开发步骤
- Lintcode Perfect Squares
- Centos 部署Keepalive高可用软件
- Codeforces Round #213 (Div. 2) A. Good Number
- qq临时会话代码修改
- LA 3907 Puzzle
- byte[] 与字符串转换
- git问题 next fetch will store in remotes/origin
- mysql 出现Duplicate entry ‘xxx’ for key ‘PRIMARY’,一个自增字段达到了上限,
- Python基础之元组
- django的闪现和增、删、改、查
- 前后端数据交互处理基于原生JS模板引擎开发
- CocoaPods 添加WebP失败解决办法
- electron+react
- apacheTomcat
- C# 读取Excel和DBF文件
- Python内置函数之isinstance,issubclass
- uva-10050-模拟水题
- go语言基础之多个defer执行顺序
- ABP 学习问题集锦