首页 > 代码库 > 关于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网络类的使用