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的页面在这里:
获取网页源码之后,怎么粹取里面的内容才是大学问,要想让网页内容发挥作用就不得不好好学习一下正则表达式。
其实只要熟练掌握了正则表达式,可以利用网页源码做很多有趣的功能,比如根据天气预报改变游戏中的天气等等。