Assetbundle為資源包不是資源
打包1:通過腳本指定打包
AssetBundleBuild ab = new AssetBundleBuild
{
assetBundleName =
PlayerSettings.bundleVersion + "@" + "zhao",//資源包assets的名字
assetNames = new string[1], //包里的每個資源的名字
};
string outputPath = Path.Combine(Utility.AssetBundlesOutputPath, Utility.GetPlatformName());
BuildPipeline.BuildAssetBundles(assetBundlePath, new[] { ab });//打包 assetBundlePath保存 路徑 打包的資源
打包2:在unity3d中更改打包
在unity3d中會自動檢測有更改這個的時候去選擇打包所有已經命名的資源,形成一個資源包assetbundle
BuildPipeline.BuildAssetBundles(assetBundlePath, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);//路徑,打包選擇的壓縮方式,選擇打包的指定平台
打包后會生成4個文件(我打包 時的名字是cube.ab后綴名可以自己取,aa,bb,dd都行不影響)
其中cube.ab是assetbundle文件,后綴名為manifest的是一個相當於配置文件一樣的,這個就是拿來看看的,不用管(加載時也不需要)
當加載的時候只需要用到cube.ab 這里包含資源和資源的依賴(解釋依賴:就是這個資源所需要的東西,比如一個prefab它需要有一個紋理mat,而當這個紋理又依賴一張圖)
最后在解釋打包后生成的AssetBundle
這個名字也是由我們而定這幾個文件的作用和cube.ab差不多
區別在與assetbundle中包含有
資源包的依賴關系(是不是發現就是大家所說的總的依賴關系!)
/////////////////////////////////////////////////////////////////////////////////
加載1:本地加載(沒有依賴的asssetbundle)

WWW windowswww = new WWW("file://" + Application.dataPath + "/AssetBundle/AssetBundle");//Application.dataPath 當前工程目錄
yield return windowswww;
AssetBundleManifest windowsasset = windowswww.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;//這里對於新手來說特別重要!
yield return windowswww;
AssetBundleManifest windowsasset = windowswww.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;//這里對於新手來說特別重要!
/*我們去www請求東西的時候是不是會看到上圖我斷點的地方,mainasset為null
*我們加載的東西不再這里,我們的資源包里是在斷點里看不到資源的
*需要通過這樣的方式去加載windowswww.assetBundle.LoadAsset("
AssetBundleManifest")就是這個AssetBundle
Manifest
*當分清這個的時候就發現網上其他的教程就完全行的通了,windowsasset 不在為null
*/
WWW cubewww = new WWW("file://" + Application.dataPath + "/AssetBundle/cube.ab");//加載完總的依賴后,就可以進一步加載我們需要的資源包了
yield return cubewww;
GameObject obj = cubewww.assetBundle.LoadAsset("vvvv@.prefab") as GameObject;//然后在加載完資源包后,就可以通過loadasset的方法去load出我們的資源
Instantiate(obj);
WWW cubewww = new WWW("file://" + Application.dataPath + "/AssetBundle/cube.ab");//加載完總的依賴后,就可以進一步加載我們需要的資源包了
yield return cubewww;
GameObject obj = cubewww.assetBundle.LoadAsset("vvvv@.prefab") as GameObject;//然后在加載完資源包后,就可以通過loadasset的方法去load出我們的資源
Instantiate(obj);
加載2:網絡加載(含有依賴一個cube(有prefab,mat,texture))
我因為需要更深的測試所有采用WWW.LoadFromCacheOrDownload的方式加載
WWW www = WWW.LoadFromCacheOrDownload(murl + objname, 2);//murl服務器地址 包名,版本號
重點解釋一下版本號和WWW.LoadFromCacheOrDownload這里講一下這個方法在使用的時候會自行保存到本地
WWW.LoadFromCacheOrDownload這個方法的的意思是當進行加載的時候會檢查本地目錄(本地目錄為PC上為C:\Documents and Settings\Administrator\Local Settings\Application Data\Unity\WebPlayer\Cache\DefaultCompany_XXXX是工程的名字,因為有些人的電腦名字為中文等等,,,然后這個目錄不一定都一樣,就慢慢找吧,其他平台的我不一一指出了)如果有而且版本號對應,就會優先使用本地的,
而這個版本號:
准備測試
有三個cube 分別為1紅色,2黃色,3綠色
| 版本號 |
本地資源
|
服務器資源
|
服務器狀態
|
結果
|
|
0
|
無 | 紅 | 開 |
紅
|
|
0
|
紅
|
紅
|
關
|
紅 |
|
1
|
紅 |
黃
|
開
|
黃
|
|
1
|
紅,黃
|
黃
|
關 |
黃
|
|
0
|
紅,黃
|
綠
|
開
|
紅
|
|
1
|
紅,黃 |
綠
|
開
|
黃
|
|
2
|
紅,黃
|
綠
|
開
|
綠
|
這里可以看出來,版本號在我們打包的時候unity並沒有提供去參與打包。
而是在第一次加載的時候加載的時候會寫入一個版本號然后存到本地?然后在去請求的時候進行版本號的對比然后在去選擇讀服務器上的還是讀本地的。這點,我也是有進行猜測,高手望指出
WWW www = LoadWww("AssetBundle");//load是我寫方法 WWW www = WWW.LoadFromCacheOrDownload(murl + objname, 0);返回www
yield return www;
if (!string.IsNullOrEmpty(www.error))//當這個有信息的時候是錯誤信息
{
Debug.Log("錯誤信息為:" + www.error);
}
else
{
AssetBundleManifest assetbundlemani = www.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;//得到總的依賴
if (assetbundlemani != null)
{
List<String> manifest = assetbundlemani.GetAllDependencies("cube.ab").ToList();//得到這個cube.ab的所有依賴資源包
foreach (string s in manifest)//進行每個加載
{
WWW sw = this.LoadWww(s);
yield return sw;
sw.assetBundle.LoadAsset(s);//每個資源都load出來
}
WWW objwww = this.LoadWww("cube.ab");//cube資源依賴加載完后
yield return objwww;
GameObject assetobj = objwww.assetBundle.LoadAsset("vvvv@") as GameObject;//直接load就可以了
if (assetobj != null)
{
Instantiate(assetobj);
}
}
yield return www;
if (!string.IsNullOrEmpty(www.error))//當這個有信息的時候是錯誤信息
{
Debug.Log("錯誤信息為:" + www.error);
}
else
{
AssetBundleManifest assetbundlemani = www.assetBundle.LoadAsset("AssetBundleManifest") as AssetBundleManifest;//得到總的依賴
if (assetbundlemani != null)
{
List<String> manifest = assetbundlemani.GetAllDependencies("cube.ab").ToList();//得到這個cube.ab的所有依賴資源包
foreach (string s in manifest)//進行每個加載
{
WWW sw = this.LoadWww(s);
yield return sw;
sw.assetBundle.LoadAsset(s);//每個資源都load出來
}
WWW objwww = this.LoadWww("cube.ab");//cube資源依賴加載完后
yield return objwww;
GameObject assetobj = objwww.assetBundle.LoadAsset("vvvv@") as GameObject;//直接load就可以了
if (assetobj != null)
{
Instantiate(assetobj);
}
}
1,加載總依賴assetbundle
2,load出需要的cube資源包依賴
3,加載cube所依賴的資源
4,加載cube
5,使用cube
在unity3d新的assetbundle打包中,所有的依賴unity3d都幫我們做好,我只要把所要加載的資源和它所依賴的資源加載出來,unity3d也幫我們組合好,直接就可以使用了。
ps:場景可以打包,文件夾也可以打包。
本人水平有限,有什么錯誤的地方望大神們指出
