首页 > 代码库 > 关于Unity中协程、多线程、www网络类的使用
关于Unity中协程、多线程、www网络类的使用
协程
我们要下载一张图片,加载一个资源,这个时候一定不是一下子就加载好的,或者说我们不一定要等它下载好了才进行其他操作,如果那样的话我就就卡在了下载图片那个地方,傻住了。我们希望我们只要一启动加载的命令,回来的时候主线程能够继续进行下去。
我们可以启动一个协程去下载,主进程依然在运行。有点类似多线程,不同的是,实际上它还是在一个线程里面,所以我们是在主线程中开启一段逻辑来进行处理,来协同当前程序的执行,还是在主线程里面。
1:在主进程中开启另外一段逻辑处理,来协同当前程序的执行,但与多线程不同都是在主线程里面执行的,而且原来的进程依然进行下去,
2:通过StartCoroutine方法来启动一个协程,StartCoroutine是MonoBehaviour的一个方法,该方法可以启动一个协程,每个协程都有一个入口函数,协程必须要是一个IEnumerator 作为返回值的方法(入口函数);
3:协同程序可以使用yield 关键字来中断协同程序;
4:协程也可以启动一个协程;
5:WaitForSeconds(): 等待多长时间后中断协程;
协程实例
1.创建Unity项目和文件目录,保存场景
2.创建一个空节点game,再创建一个脚本game挂载在gamej节点下
打开game脚本
using System.Collections; using System.Collections.Generic; using UnityEngine; public class game : MonoBehaviour { private int level=3; // Use this for initialization void Start () { //启动一个协程,必须是继承自MonoBehaviour才能使用 this.StartCoroutine(this.con_entry()); //主线程依然在执行 //... } //协程和主线程是在同一个线程里面的,不会有什么线程切换 //协程的入口函数 IEnumerator con_entry(){ //协程的代码 Debug.Log("con_entry run!!"); Debug.Log("level:" + this.level);//也能够拿到this的变量 this.StartCoroutine(this.con_other());//再开启一个协程con_other //end //使用yield中断协程程序,就是让它停下来 yield return null; //协程结束以后的代码,比如去网上捞一个什么东西,下载图片之类的,捞完之后的操作 //end } IEnumerator con_other() { Debug.Log("con_other"); this.StartCoroutine(this.con_entry_params(3));//再开启一个协程con_entry_params,且传递参数 yield return null; } IEnumerator con_entry_params(int a) { Debug.Log("con_entry_params: " + a); yield return new WaitForSeconds(3);//设置3秒中之后才中断协程 Debug.Log("after WaitForSeconds send");// 处理协程结束的逻辑 } // Update is called once per frame void Update () { } }
多线程
1: using System.Thread;
2: 创建一个线程: Thread r = new Thread(callback); r.start(); 启动运行线程;
3: 线程回掉函数 void run() {}
4: 多个线程访问同一个数据的时候,会发生”冲突”,需要线程安全的方式来访问;
5: 线程锁是在访问公共数据的时候,先去获得这个锁,没有获得锁的线程将会被挂起,指导这个锁被释放。
6: public static Object o = new Object(); lock(o) {线程安全的执行代码};
7: 线程休眠: Thread.Sleep(单位为ms);
8: 多线程之间要避免死锁;
关于Unity中协程、多线程、www网络类的使用