您好,登錄后才能下訂單哦!
啊,長嘆一聲,弄了一晚上,加半個白天
先說說歷程吧,主要是踩的坑。
首先打包就不用說了。有.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的設置上,思路和程序沒有問題。
總結:
問題解決,大滿足
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。