背景
1、最近看了几位专栏作家的文章,几篇提到了资源通过网络的动态获取。如何建立一个快速的测试环境,不免是一个问题,也就最简单的就是假设http服务器了,微软系的当然首选的IIS了,别的也能用阿帕奇或者Tomcat了,net平台更轻量级的技术也有比如HttpListener或者Nancy都可以,虽然对于本人来说,创建IIS或者动手写一个轻量级的不是什么难事。但是在win10或者win8上装一个IIS扩展或者自己写一个小的服务器还是比较烦躁(反正我是不太喜欢在个人电脑上装服务类程序,你呢?),我想大家也一定有同样的选择问题,这里其实有更简单的选择。
2、可能地球人都知道Unity其实不是很推荐使用多线程,当然异步调用还是很有必要的,比如本文说的获取IO资源这样比较耗时的操作,所以最近也研究了一些大家分享的多线程的文章,看了一圈觉得让人满意的不多,知识点较多,封装的较少,比较初级,这里拍砖引玉,简单引入一把牛刀,亮亮眼。
实现
1、这里不卖关子了,如何建设一个就简单的Web服务器作为网络资源的测试服务器,这里我采用的方法是采用一个绿色微型的Web服务器,叫做MyWebServer,而且是绿色的无须安装,解压后是这个样子
这里其实我们看到asp.dll ,asp.net.dll,php等文件其实它不光能模拟静态资源的获取,动态资源其实也是可以得比如Json什么的,不过不是本篇想讲的内容,如果想了解自己看看程序帮助文档即可。
双击MyWebServer.exe运行即可,会启动左下的小窗口,这里可以定义服务目录和高级设置,这里如果就是本机测试使用就不用点击高级设置了,其实也用不着
我们进入web文件夹,也就是服务目录(或者叫虚拟目录,就是想在web服务器上陈列的文件内容)
这里我给Web目录中添加了一张图片,用来在Unity中动态获取,这里分别用图片和a.asp来测试下,在浏览器中通过本机IP进行测试如下图都成功了,至此一个绿色的版本的本地网络资源测试服务器建立完毕了,是不是很简单。
2、如何通过Unity异步获得网络图片资源,这里不使用系统协程来实现,而是用UniRx异步调用实现
using UnityEngine;
using UniRx;
public class BackgroundLoad : MonoBehaviour {
// Use this for initialization
void Start () {
ObservableWWW.GetWWW("http://127.0.0.1/Map2.jpg").Subscribe(www =>
{
if (string.IsNullOrEmpty(www.error))
{
Texture2D texture = www.texture;
SpriteRenderer render = this.GetComponent<SpriteRenderer>();
render.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
}
});
}
}
这里我怀疑Unity原生的WWW类应该是异步的,只是通过协程轮询的方式效率不高而已。关于UniRx的知识可以另行学习或者参考我的这篇文章Unity基于响应式编程(Reactive programming)入门。