您的位置:首页 > 移动开发 > Unity3D

Unity 协同函数、WWW

2016-07-28 00:14 489 查看
协同函数 Coroutine :一段协作Update函数完成功能实现的函数,可以理解为开启一段新的线程(本质不是开启新的线程,只是在Update执行完之后,运行协同函数,具体查看unity函数生命周期表)

协同函数的定义:

IEnumerator 函数名(传递参数)

{

//something work here

yield return 条件;

//others work here

}

协同函数调用方式:使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。

代码示例

void Start(){
StartCoroutine(Test());
}
void Update(){
Debug.Log("Nowardtime is "+Time.time);
}
IEnumerator Test(){
WWW  www = new WWW (url);
yield return www;
if(www.isdone){
Debug.Log("Loading is Over  at " +Time.time);
}
}


协同函数功能说明:开启协同函数之后,代码的运行顺序如下:

Start() -> IEnumerator something before return -> Update() -> 条件 is true -> IEnumerator others after return

yield后面紧跟的是条件语句,执行到yield return 之后,这个协程会挂起,把执行权交给调用它的父函数,满足条件语句之后再执行yield下面的代码。

在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。另一种方法是即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启;如是将协同程序所在脚本的enabled设置为false则不会生效。这是因为协同程序被开启后作为一个线程在运行,而MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线程。然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重名。

WWW 加载网络本地文件:

WWW www = new WWW(url);
//WWW加载文件可以支持http、ftp、file
//url = "http://***.****.文件名"; 加载网络文件
//url = "file:///c:/test/test.txt"; 加载本地文件


文件存储:

byte[] pngData = www.EncodeToPNG();
File.WriteAllBytes(path+url.GetHashCode(), pngData);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity