unity获取网页源码

主要是想获取天气,原理是先获取天气预报网页的源码,然后用正则表达式截取天气部分文本。 Unity的C#脚本跟一般的C#语言还是有点区别的,总得来说引擎脚本处理的主要是表层的行为,知道mono函数基本就够用了,但C#语言是要从比较底层开始搭建,虽然都是C#,但思维方式不太一样。Unity为了使用方便,把常用功能都封装到MonoBehaviour里了,所以用起来方便,但不利于学习语言。

获取网页源码,在C#中一般有四种方法:WebClient、WebRequest、HttpWebRequest,还有WebBrowser控件。但一般如果只是为了获取网页源码的话就没必要用控件了。

下面是三种方法的例子:

WebClient

1
2
3
4
5
6
7
8
9
10
private string GetWebClient(string url)
{
    string strHTML = "";
    WebClient myWebClient = new WebClient();
    Stream myStream = myWebClient.OpenRead(url);
    StreamReader sr = new StreamReader(myStream, System.Text.Encoding.GetEncoding("utf-8"));
    strHTML = sr.ReadToEnd();
    myStream.Close();
    return strHTML;
}

WebRequest

1
2
3
4
5
6
7
8
9
10
11
12
13
private string GetWebRequest(string url)
{
    Uri uri = new Uri(url);
    WebRequest myReq = WebRequest.Create(uri);
    WebResponse result = myReq.GetResponse();
    Stream receviceStream = result.GetResponseStream();
    StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));
    string strHTML = readerOfStream.ReadToEnd();
    readerOfStream.Close();
    receviceStream.Close();
    result.Close();
    return strHTML;
}

HttpWebRequest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private string GetHttpWebRequest(string url)
{
    Uri uri = new Uri(url);
    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);
    myReq.UserAgent = "User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705";
    myReq.Accept = "*/*";
    myReq.KeepAlive = true;
    myReq.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
    HttpWebResponse result = (HttpWebResponse)myReq.GetResponse();
    Stream receviceStream = result.GetResponseStream();
    StreamReader readerOfStream = new StreamReader(receviceStream, System.Text.Encoding.GetEncoding("utf-8"));
    string strHTML = readerOfStream.ReadToEnd();
    readerOfStream.Close();
    receviceStream.Close();
    result.Close();
    return strHTML;
}
注意“utf-8”应与指定网页的编码对应。

总结

HttpWebRequest方式最复杂但也最灵活。有的网站检测客户端的UserAgent,如果使用WebClient或WebRequest方式获取,会获取到错误提示页面的内容,通过HttpWebRequest就没问题了。

下面说Unity的获取方式

Unity中与网页交互都通过WWW类实现。注意,WWW是一个类,位于UnityEngine命名空间。

先看一下Unity文档中给出的范例代码:

1
2
3
4
5
6
7
8
9
10
11
using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    public string url = "http://images.earthcam.comec_metrosourcams/fridays.jpg";
    IEnumerator Start() { //这里用枚举器了
        WWW www = new WWW(url);
        yield return www; //返回枚举器元素www
        renderer.material.mainTexture = www.texture; //将网址的图片用在材质贴图上了
    }
}

这个好强大,有空再研究WWW。先说获取网页源码……还没说到……

先声明一个WWW类的实例:

1
WWW www;

然后把一个http网址赋值给它:

1
2
3
private const string url = "http://www.weather.com.cn/beijing/index.shtml";
//最好先存一个string字段,用起来比较方便
this.www = new WWW (url);

在使用这个www的时候要注意,这个赋值过程是需要时间的,因为要在后台从网上下载数据,如果还没下载完,程序就调用www的值就会报错了。所以在使用www的时候一定要先判断是否下载成功,是否下载完毕。

1
2
3
4
5
6
protected static string sourceCode;

if (this.www.isDone) //返回bool值
{
	sourceCode = www.text;
}

所以,上面的代码就获取到网页的源代码了,剩下就是怎么用的问题了。

www获取的内容一般都是个文件,不管是html还是图片等都一样,因此获取数据以后,脚本要使用它就需要转换为正确的类型。

Unity的官方文档介绍WWW的页面在这里:

点我查看WWW官方文档

获取网页源码之后,怎么粹取里面的内容才是大学问,要想让网页内容发挥作用就不得不好好学习一下正则表达式

其实只要熟练掌握了正则表达式,可以利用网页源码做很多有趣的功能,比如根据天气预报改变游戏中的天气等等。

留言