一、使用AssetBundle進行打包與加載
個人覺得可以參考以下兩篇博客,這個網上相關教程很多,還不明白的可以去百度,或者給我留言。
Unity 打包與加載AssetBundle(加載對應的依賴)
Unity中的AssetBundle
二、使用AssetBundle進行加載的時候注意事項:
注意事項一:AssetBundle名字和設置AssetBundle名字的預制體這兩個名字都要和C#代碼方法中的參數(shù)一一對應。
如果不對應的話,在Unity的控制臺會報這個錯誤:ArgumentException: The Object you want to instantiate is null.
1、這是我要打包的預制體。
可以看出TestCapsule這個預制體對應的AssetBundle名字我設置成為test_1
2、我是采用Unity官方提供的AB包管理插件AssetBundle Browser 進行打包。讀者可以采用自定義腳本的方式進行打包,個人只是覺得插件打包的這種方式很好用。
點擊Build按鈕后,會在項目Assets文件夾下生成一個StreamingAssets文件夾,這個StreamingAssets文件夾里面就是打出來的AssetBundle文件。
點擊Build按鈕后,在項目Assets文件夾同級目錄還有一個AssetBundles文件夾,這個AssetBundles文件夾里面也是打出來的AssetBundle文件。
注意:StreamingAssets文件夾和AssetBundles文件夾里面的AssetBundle文件內容都是一樣的。
3、利用C#代碼加載AssetBundle資源包(本地相對路徑加載)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class TestABLoad : MonoBehaviour
{
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "test_1"));
GameObject cube = ab.LoadAsset("TestCapsule") as GameObject;//LoadAsset方法中參數(shù)為導出前Prefab名字
Instantiate(cube);//生成
}
}
這里需要注意的是AssetBundle.LoadFromFile方法中的參數(shù)為打出來的AssetBundle文件路徑。
也就是Assets目錄下StreamingAssets目錄中,也就是test_1這個文件的全名(有后綴名的話要包括后綴名,沒有后綴名可以不包括)。
還有下圖中LoadAsset方法中的參數(shù)是要和設置test_1這個AssetBundle文件名的預制體名字保持一致。
4、保存腳本后,回到Unity中,把這個TestABLoad腳本掛載到游戲中任意一個游戲物體上面,運行游戲之后,可以看到test_1這個資源包對應的游戲資源就被加載出來了。
注意事項二:利用C#代碼加載本地絕對路徑AssetBundle資源包
1、上面也提到過,項目Assets文件夾同級目錄還有一個AssetBundles文件夾,這個AssetBundles文件夾里面也是打出來的AssetBundle文件。StreamingAssets文件夾和AssetBundles文件夾里面的AssetBundle文件內容都是一樣的。所以也可以使用AssetBundles文件夾里面的AssetBundles文件進行加載。
可以看出來這個文件夾不在項目Assets目錄下,所以要使用絕對路徑進行加載。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class TestABLoad : MonoBehaviour
{
void Start()
{
var myLoadedAssetBundle = AssetBundle.LoadFromFile("G:\\C++ Open Sources Project\\NoahGameFrameClient\\UnityDemo\\AssetBundles\\StreamingAssets\\test_1");
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestCapsule");
Instantiate(prefab);
}
}
2、保存腳本后,回到Unity中,把這個TestABLoad腳本掛載到游戲中任意一個游戲物體上面,運行游戲之后,可以看到test_1這個資源包對應的游戲資源就被加載出來了。
3、但我這做了一個小測試,把這個TestABLoad腳本掛載到我本地的另一個Unity項目場景中的一個游戲物體上,游戲運行后,對應的資源并沒有加載出來,并且會報錯。所以由此可知,X項目打出來的AssetBundles文件就只能X項目進行使用,其他項目并不能進行使用。
注意事項三:三種壓縮方式的比較:
NoCompression:不壓縮,解壓快,包較大,不建議使用。
LZMA: 壓縮最小,解壓慢,用一個資源要解壓包下所有資源。
LZ4: 壓縮稍大,解壓快,用什么解壓什么,內存占用低,一般建議使用這種。
1、就拿我要打包的這個預制體為例,可以看出這個預制體文件占用為3KB。
2、當我選擇NoCompression不壓縮,解壓快,包較大,不建議使用的這種方式,進行打包,可以看出,打包出來的文件占用為138KB。
3、當我選擇LZMA:壓縮最小,解壓慢,用一個資源要解壓包下所有資源的這種方式,進行打包,可以看出,打包出來的文件占用為28KB。
4、當我選擇LZ4: 壓縮稍大,解壓快,用什么解壓什么,內存占用低,一般建議使用這種的這種方式,進行打包,可以看出,打包出來的文件占用為45KB。
注意事項四:刪除test_1這個AssetBundle資源包對應的TestCapsule預制體,項目運行后還能正常加載出來TestCapsule預制體。
1、這是test_1這個AssetBundle資源包對應的TestCapsule預制體。
2、把這個TestCapsule預制體從當前項目中刪除掉。
3、把上面相對路徑或者絕對路徑TestABLoad腳本掛載到場景中的某一個游戲物體上面,運行游戲之后,可以看到test_1這個資源包對應的游戲資源就被加載出來了。
這是使用本地絕對路徑進行加載。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class TestABLoad : MonoBehaviour
{
void Start()
{
var myLoadedAssetBundle = AssetBundle.LoadFromFile("G:\\C++ Open Sources Project\\NoahGameFrameClient\\UnityDemo\\AssetBundles\\StreamingAssets\\test_1");
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("TestCapsule");
Instantiate(prefab);
}
}
接下來,我們使用本地相對路徑進行加載,運行游戲之后,可以看到test_1這個資源包對應的游戲資源就被加載出來了。文章來源:http://www.zghlxwxcb.cn/news/detail-501522.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class TestABLoad : MonoBehaviour
{
void Start()
{
AssetBundle ab = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "test_1"));
GameObject cube = ab.LoadAsset("TestCapsule") as GameObject;//LoadAsset方法中參數(shù)為導出前Prefab名字
Instantiate(cube);//生成
}
}
由以上可知,資源的加載并不是依賴于test_1這個AssetBundle資源包對應的預制體TestCapsule,而是依賴于對應的test_1這個AssetBundle資源包。文章來源地址http://www.zghlxwxcb.cn/news/detail-501522.html
到了這里,關于Unity中使用AssetBundle打包與加載的注意事項的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!