Unity 服务器踩坑 Node.js 与 Express 资源热更新与文件传输(三)
目录
一、下载安装Node.js
安装,傻瓜式点击教程
二、安装Express
打开cmd一步一步cd进入C:\Program Files\nodejs\node_modules\npm文件夹下
然后执行npm install --save express安装Express
如上图安装成功
三、webserver.js
在任意地方创建一个叫webserver的文件夹
在文件夹下创建一个www_root的目录和一个webserver.js的文件
在www_root目录下放一个文件(我这里以AB包举例)
var path = require("path");
var express = require("express");
var app = express();
app.use(express.static(path.join(process.cwd(), "www_root")));
app.listen(6080);
大功告成!
五、运行Node.js服务器
cd到webserver目录下,然后输入 node webserver.js 回车
输入 http://127.0.0.1:6080/XXX(XXX为你的文件名)
可以看到弹出了下载文件的窗口
至此Node.js服务器搭建完毕
四、Unity通过www下载文件
StartCoroutine(loadAssetBundle());
IEnumerator loadAssetBundle()
{
WWW w = WWW.LoadFromCacheOrDownload(url, version);
yield return w;
Debug.Log("download end");
if (w.error != null)
{
Debug.Log(w.error);
}
AssetBundle bundle = w.assetBundle;
Debug.Log("download success...");
Object prefab = bundle.LoadAsset<GameObject>(fileName);
GameObject obj = (GameObject)Instantiate(prefab);
obj.transform.position = transform.position;
bundle.Unload(false);
}
如果要缓存到本地目录请用
IEnumerator loadFile()
{
WWW w = new WWW(url);
yield return w;
FileStream fs;
FileInfo t = new FileInfo(Application.streamingAssetsPath + "/"+fileName);
byte[] bytes = w.bytes;
if (!t.Exists)
{
fs = t.Create();
}
else
{
t.Delete();
fs = t.Create();
}
fs.Write(bytes, 0, bytes.Length);
fs.Close();
fs.Dispose();
}
运行后...
下面来说下这两种缓存方式的差异
第一种LoadFromCacheOrDownload
从服务器下载资源,并且保存在本地高速缓存,下次资源没改变的情况下从高速缓存读取
url:资源地址
version:资源版本
这样做的好处是如果你只是本次运行程序临时下载,可以避免重复下载,节省流量和储存空间,减少垃圾
但是只能读取AB包,也就是说你的其他文件也要打成AB包读取
缓存目录应该在
C:\Users\Administrator\AppData\LocalLow\Unity\WebPlayer\Cache\CompanyName_ProductName
每个版本会下载对应的缓存文件夹
每份缓存由__info和CAB-XXXX组成
__info中记录的是当前资源的版本号,CAB-XXXX是缓存文件了,本地有缓存时和它做crc校验了,当CAB-XXXX被改变时(可以人为破坏),crc校验失败,就会重新从服务器下载新的资源
第二种 WWW w = new WWW(url);
需要手动指定文件夹目录缓存,下载文件类型不限于AB包