Unity 服务器踩坑 Node.js 与 Express 资源热更新与文件传输(三)

目录


一、下载安装Node.js

传送门:https://nodejs.org/en/

安装,傻瓜式点击教程

二、安装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包

猜你喜欢

转载自blog.csdn.net/qq_34204419/article/details/82798956