啊,長嘆一聲,弄了一晚上,加半個白天
創(chuàng)新互聯(lián)于2013年開始,先為田東等服務(wù)建站,田東等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為田東企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。先說說歷程吧,主要是踩的坑。
首先打包就不用說了。有.asseetbundle的,有.u3d的,還有就是生成md5列表
然后下載并保存就惡心了。
本來想的很好,思路其實(shí)也正確。
AssetBundle生成到StreamingAssets文件夾下
我在本機(jī)上(win10x64),IIS開了個站,開了FTP,用FileZilla把StreamingAssets文件夾上傳到站上。
這樣這些AssetBundle就有了url:“http://localhost:9999/StreamingAssets/a.assetbundle”
上傳后,把本地的StreamingAssets文件夾刪掉,程序中判斷如果沒有這個文件夾,則創(chuàng)建,下載md5列表文件,按文件中列出的文件列表把遠(yuǎn)程服務(wù)器上的所有assetbundle下載到本地來。這個過程的代碼就不說了,不復(fù)雜,執(zhí)行的也很順利。主要是從下面開始坑了。
用WWW,從遠(yuǎn)程url地址下載,再用二進(jìn)制寫入本地路徑文件
string localFilePath = "..."; //要保存到本地的文件全路徑
string savePath = "..."; //文件存儲的文件夾
string url = "http://..."; //要下載的遠(yuǎn)程文件地址
//判斷一下文件要存儲的文件夾是否存在,不存在則創(chuàng)建
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("go");
}
}
就在這一步
AssetBundle ab = www.assetBundle;
報錯了:
Failed to decompress data for the AssetBundle 'Memory'`
但是請注意,用new WWW(localFilePath) 加載是沒有任何問題的。
百撕不得其姐,于是搜索引擎查唄
一種說法是FileZilla向網(wǎng)站上傳時要設(shè)置二進(jìn)制
好吧,設(shè)置了,刪掉重新上傳,還是這樣
于是把上傳的文件直接拷貝過來,而不是在程序中用WWW下載,可以用,加載包沒有問題
這就不好玩了,但是能確定的是問題是出在從遠(yuǎn)程下載并保存到本地這個步驟
那就換一種下載方法
用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映射
度娘查了一下,終于發(fā)現(xiàn)了真正的問題。
程序是沒問題的,思路是正確的,問題出在了IIS的設(shè)置上
具體的說就是MIME的設(shè)置
即IIS中需要對不同的文件類型進(jìn)行MIME映射才能使其類型的文件能在網(wǎng)站端正常的被讀取下載,大概是這個意思。那就設(shè)置吧
win+R
輸入compmgmt.msc回車
點(diǎn)擊‘添加’
如上圖
擴(kuò)展名把你打包的擴(kuò)展名填進(jìn)去,如我是用的assetbundle和u3d
MIME類型中填寫:application/octet-stream
好了,重啟一下網(wǎng)站,再運(yùn)行,OK了,正常下載和加載,出了一個小問題
就是文件夾下名為StreamingAssets的文件,即與文件夾同名,無擴(kuò)展名的文件無法下載
再查一下
還是要設(shè)置MIME,無擴(kuò)展名怎么辦
還是上圖,在文件擴(kuò)展名一欄中填一個點(diǎn)"."
MIME一欄還是填:application/octet-stream
OK了
至于manifest文件,本身就在IIS的默認(rèn)設(shè)置里有
也就是說,用IIS,一定要把你打包的assetbundle文件擴(kuò)展類型設(shè)置MIME,比如你打的包是xxx.ab,那ab就要像這樣設(shè)置MIME映射
再回過頭來,還把UnityWebRequest換回WWW的加載方式,也OK了
即 ,此次問題就是出在IIS的設(shè)置上,思路和程序沒有問題。
總結(jié):
問題解決,大滿足
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。