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

    不断的读取任务。能够设定一个固定时间来读取任务




    
  • 相关阅读:
    在 Ubuntu上使用 MySQL
    Ubuntu/CentOs 搭建SVN服务器
    一个简单的零配置命令行HTTP服务器
    Windows 环境下 NodeJs 开发 Log
    AngularJS
    thinkphp5.0使用workerman多线程实例
    bat自动备份数据库文件
    mysql.ini配置优化速度参考
    php解析识别二维码内容
    windows屏蔽windows错误报告提示框
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6733351.html
Copyright © 2020-2023  润新知