Unity中如何利用一个协程和www类实现简单的图片下载

Unity中如何利用一个协程和www类实现简单的图片下载<18/10/2017>

原文地址:http://www.manew.com/thread-96238-1-1.html
今天讲解一下如何使用WWW类和协程完成简单的图片和视频下载播放功能。
一、WWW类
        WWW是一个Unity开发中非常常用到的工具类,主要提供一般Http访问的功能,以及动态从网上下载图片、声音、视频、Unity资源等。
注意:iPhone支持http://, https:// 和 file://协议;ftp://协议的支持仅限于匿名下载。其他协议不被支持。
当在windows和Windows Store Apps使用文件协议来访问本地文件,需要使用file:///(带有三个斜线)。

WWW类的主要常用属性有:

Unity中如何利用一个协程和www类实现简单的图片下载_第1张图片


www类加载图片的官方的示例代码如下:
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    public string url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";
    IEnumerator Start() {
        WWW www = new WWW(url);
        yield return www;
        renderer.material.mainTexture = www.texture;
    }
}

二、协程
1、什么是协程?
       协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。
        Unity在每一帧都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足)。协程跟Update()其实一样的,都是Unity每帧都会去处理的函数。如果在一个对象的前期调用协程,协程会立即运行到第一个 yield return 语句处,如果是 yield return null ,就会在同一帧再次被唤醒。      

2、协程的写法
       Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自己的集合类型编写枚举器。也就是一个 IEnumerator 返回值,一个
yield return null 的语句。
   IEnumerator SayHi() 
        {                        
           // 协程中必须有返回值 yield return
                        yield return null;
        }



   //带参数的:
   IEnumerator        SayHello(string name){
                print (name);
                yield return null;
        }

3.*协程中的细节*
        1.协程与普通方法一样,可以被多次调用, 
        2.协程一旦被开启之后,总是试图将方法中的代码执行完,之后停止。
        3.在协程内,如果遇到yield return null ,0 , 1 ...;表示剩余代码将在下一帧继续执行,
        4.在协程中遇到 yield return new WaitForSeconds (n); 代码;表示剩余代码将在 n 秒之后执行。 
        5. 在协程中如果遇到 yield return StartCoroutine (Son ()), 表示剩余代码将在子协程执行完成之后继续执行。子协程仍然满足协程基本规则。
        6.在协程中如果遇到 yield return new WaitForFixedUpdate (), 表示剩余代码将在FixedUpdate 执行完毕之后继续向下执行。
        7. 在协程中如果遇到 yield return new WaitForEndOfFrame (), 表示剩余代码将在ONGUI 执行完毕之后继续向下执行。
        8.在协程中如果遇到 yield return WWW,表示剩余代码将在 www 下载文件之后继续向下执行。
        9.在协程中如果遇到  yield return obj ,表示剩余代码将在obj 部位空的时候继续向下执行。
10.在协程中如果遇到  yield return new WaitForSeconds (n) ,会受到Time.timeScale 的影响。
11.协程方法,可以当做普通方法,在两个脚本之间自由调用。 
12. 生命周期内的方法,也可以改造成协程方法。


4、启动协程的写法。
        //3.1 启动协程
                StartCoroutine(SayHi());
                 //3.2 方法名开启
                StartCoroutine("SayHi");
                 //3.3 启动带参数的协程
                StartCoroutine(SayHello("hello"));
                StartCoroutine ("SayHello","你好");

        //关闭协程 ,注意只能通过字符串去关闭一个协程。
                StopCoroutine("SayHi");

  
代码示例:利用一个协程和www类实现简单的图片下载展示:
        1.在unity中搭建好一个场景需要一个RawImage。
      2.创建一个脚本,完成以下代码:

        //  1) 定义一个RawImage用于展示图片
        RawImage l_rawImage;
        //  2) 图片的网址
        string imgUrl;
  void Start ()
        {
                // 代码获取我们的RawImage
                l_rawImage =
                             GameObject.Find("RawImage").GetComponent ();        
                // 网址赋值
                imgUrl = "http://g.hiphotos.baidu.com/image/h%3D360/sign" +
              "=07ad353ef403738dc14a0a24831ab073/08f790529822720eb2"                           +"5fa86479cb0a46f31fab9f.jpg";
                // 开启下载图片的协程。
                StartCoroutine (LoadImage ());

        }

// 实现加载协程的方法
        IEnumerator LoadImage()
        {
                        // 根据连接下载
                WWW www = new WWW (imgUrl);
                // 等待WWW 代码执行完毕之后后面的代码才会执行。
                yield return www;
                // 将下载的textrue 在RawImage上展示
                l_rawImage.texture = www.texture;

        }
        以上代码就能实现一个简单的图片下载和展示的功能了。

你可能感兴趣的:(www类)