文件的导入与打包
为了能够方便地制作资源,我们需要制作一个桌面端的程序,用于导入图片和视屏资源,将资源绑定在一起,组成可被手机应用识别的数据包,并将数据包上传到服务器,最后得到数据包在服务器上地址的二维码,手机应用可以通过扫描二维码的形式下载该数据包。本周,我主要测试了一下Unity中文件导入和打包的功能。
文件导入
读取文件:在读取文件上,我用到了两个比较重要的东西。其一是Windows.Form,它是一个可以让Unity调用Windows接口的插件,我主要使用此插件来打开资源浏览器,用于给用户选取文件路径。
OpenFileDialog opLog = new OpenFileDialog();
opLog.InitialDirectory = UnityEngine.Application.dataPath;
opLog.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*";
DialogResult result = opLog.ShowDialog();
获得了路径后,还需要将改路径的文件读入程序,这里所使用的是Unity自带的WWW类。WWW是一个十分简单实用的网络请求类,其可以发送Post和Get请求来实现资源的上传和下载,而除此之外,WWW还可以读入本地的文件,只需要在本地文件地址前填入“file://”协议即可。虽然WWW的导入过程需要写在协程函数中,在调试时无法打断点中断,但仍然还是十分方便的。
//通过www读入本地文件。
private IEnumerator opt(string path)
{
string str = "file:///" + path;
string filename = path.Substring(path.LastIndexOf("\\") + 1);
filename = filename.Substring(0, filename.LastIndexOf('.'));
www = new WWW(@str);
yield return www;
if (www != null && string.IsNullOrEmpty(www.error))
{
//获取Texture
//Texture texture = www.texture;
string fullpath = UnityEngine.Application.dataPath + "/Resources/" + filename + ".png";
Debug.Log(fullpath);
testimage.canvasRenderer.SetTexture(txt);
Debug.Log("加载成功");
}
else
{
Debug.Log(www.error);
}
}
写入文件:通过WWW导入文件后,便需要将文件写到特定的文件夹,以进行打包,说白了,这就是一个复制粘贴的过程。WWW虽然可以读取文件,但似乎没有写入文件的功能,因此需要使用到File类。
File类也就是文件流类,使用起来也比较简单,只需要调用其静态函数WriteAllBytes,以输出路径和文件的字节数据为参数就行了。
byte[] data = www.texture.EncodeToPNG();
File.WriteAllBytes(fullpath, data);
文件打包
Unity自身并没有什么可以方便动态打包的工具,因此,我使用了ICSharpCode.SharpZipLib库来进行zip打包。这个库和Zxing一样只是一个动态库文件,只需要拖入工程项目中就可以使用了。SharpZip的打包代码不是那么直观,因此需要做一下封装。具体代码比较多我就不放上来了,封装后的类是ZipUtility。
string[] Array = new string[1];
Array[0] = UnityEngine.Application.dataPath + "/Resources";
ZipUtility.Zip(Array, UnityEngine.Application.dataPath + "/ZIPS/test.zip",null, cbk);
其中Zip函数的第一个参数是源文件的目录,第二个参数是输出路径,第三个参数是密码,第四个参数是一个自己写的回调函数,用于跟踪打包状态。