1. 程式人生 > >從IIS網站上下載AssetBundle,並寫入到本地磁盤指定路徑

從IIS網站上下載AssetBundle,並寫入到本地磁盤指定路徑

Go 裏的 都是 .text mage proc RM oca 怎麽

啊,長嘆一聲,弄了一晚上,加半個白天

先說說歷程吧,主要是踩的坑。

首先打包就不用說了。有.asseetbundle的,有.u3d的,還有就是生成md5列表

然後下載並保存就惡心了。

本來想的很好,思路其實也正確。

AssetBundle生成到StreamingAssets文件夾下
我在本機上(win10x64),IIS開了個站,開了FTP,用FileZilla把StreamingAssets文件夾上傳到站上。
這樣這些AssetBundle就有了url:“http://localhost:9999/StreamingAssets/a.assetbundle”

上傳後,把本地的StreamingAssets文件夾刪掉,程序中判斷如果沒有這個文件夾,則創建,下載md5列表文件,按文件中列出的文件列表把遠程服務器上的所有assetbundle下載到本地來。這個過程的代碼就不說了,不復雜,執行的也很順利。主要是從下面開始坑了。

用WWW,從遠程url地址下載,再用二進制寫入本地路徑文件

string localFilePath = "...";         //要保存到本地的文件全路徑
string savePath = "...";               //文件存儲的文件夾
string url = "http://...";                  //要下載的遠程文件地址

//判斷一下文件要存儲的文件夾是否存在,不存在則創建
if(!Directory.Exists(savePath))
{
        Directory.CreateDirectory(savePath);
}

//下載
using(WWW www = new WWW(url))
{
        yield return www;
        if(www.error == null && www.isDone)
        {
                //寫入本地文件
                File.WriteAllBytes(localFilePath, www.bytes);
        }
}

好的,到此為止,沒有任何錯誤,StreamingAssets文件夾裏的所有東東都下載到本地了,看文件大小好像也沒有問題。

既然下載下來了,就得用啊,還是用WWW吧

string localFilePath="file:///..";             //本地要加載的AssetBundle文件路徑
using(WWW www = new WWW(localFilePath))
{
        yield return www;
        if(www.error ==null && www.isDone)
        {
                AssetBundle ab = www.assetBundle;
                GameObject go = ab.LoadAsset<GameObject>("go");
        }
}

就在這一步

AssetBundle ab = www.assetBundle;

報錯了:
Failed to decompress data for the AssetBundle ‘Memory‘`

但是請註意,用new WWW(localFilePath) 加載是沒有任何問題的。

百撕不得其姐,於是搜索引擎查唄

一種說法是FileZilla向網站上傳時要設置二進制

技術分享圖片

好吧,設置了,刪掉重新上傳,還是這樣

於是把上傳的文件直接拷貝過來,而不是在程序中用WWW下載,可以用,加載包沒有問題

這就不好玩了,但是能確定的是問題是出在從遠程下載並保存到本地這個步驟

那就換一種下載方法

用UnityWebRequest

using (UnityWebRequest req = UnityWebRequest.Get(fileUrl))
                        {
                                                        string filePath = "...";
                            string savePath = "...";
                            if (!Directory.Exists(savePath))
                            {
                                Directory.CreateDirectory(savePath);
                            }

                            yield return req.SendWebRequest();
                            if (req.isNetworkError || req.isHttpError)
                            {
                                Debug.LogError(req.downloadHandler.text);
                            }
                            else
                            {
                                File.WriteAllBytes(filePath, req.downloadHandler.data);
                                Debug.Log(fileUrl + " downloaded");
                            }
                        }

這回更有趣,只下載了.manifest文件,而assetbundle還有.u3d這些包沒有下載

看了一下,報的錯是404 File Not Found

底下還提到了MIME映射

度娘查了一下,終於發現了真正的問題。

程序是沒問題的,思路是正確的,問題出在了IIS的設置上

具體的說就是MIME的設置

即IIS中需要對不同的文件類型進行MIME映射才能使其類型的文件能在網站端正常的被讀取下載,大概是這個意思。那就設置吧

win+R

輸入compmgmt.msc回車

技術分享圖片

技術分享圖片

點擊‘添加’

技術分享圖片

如上圖
擴展名把你打包的擴展名填進去,如我是用的assetbundle和u3d
MIME類型中填寫:application/octet-stream

好了,重啟一下網站,再運行,OK了,正常下載和加載,出了一個小問題
就是文件夾下名為StreamingAssets的文件,即與文件夾同名,無擴展名的文件無法下載

再查一下

還是要設置MIME,無擴展名怎麽辦

還是上圖,在文件擴展名一欄中填一個點"."
MIME一欄還是填:application/octet-stream

OK了

至於manifest文件,本身就在IIS的默認設置裏有

也就是說,用IIS,一定要把你打包的assetbundle文件擴展類型設置MIME,比如你打的包是xxx.ab,那ab就要像這樣設置MIME映射

再回過頭來,還把UnityWebRequest換回WWW的加載方式,也OK了

即 ,此次問題就是出在IIS的設置上,思路和程序沒有問題。

總結:

  1. 上傳時用二制方式上傳,因為都是二進制文件
  2. IIS的MIME設置要搞好

問題解決,大滿足

從IIS網站上下載AssetBundle,並寫入到本地磁盤指定路徑