1.方式1-設置AssetBundleName打包
- 設置AssetBundleName
- 調用打包函數。
Unity會將AssetBundle相同名字的資源打包到一個AssetBundle中。
每個AssetBundle都對應一個同名.mainfest,.mainfest包含此AssetBundle中包含的資源。
同時自動添加,並維護此AssetBundle依賴的AssetBundle名稱。
AssetBundle設置Name由兩種方式:
1.編輯器編輯,如上圖。
2.代碼修改(一般都是代碼修改,AssetBundleName有斜杆,會斜杆前會創建文件夾,例如chen/logo,會在導出目錄下邊創建文件夾名chen,再在chen文件夾下創建名爲logo的AssetBundle)
static void ChangeAssetbundleName()
{
Object[] selects = Selection.objects;
foreach (Object selected in selects)
{
//返回所有對象相對於工程目錄的存儲路徑如Assets/_Scenes/Main.unity
string path = AssetDatabase.GetAssetPath(selected);
//把一個目錄的對象檢索爲AssetImporter
AssetImporter asset = AssetImporter.GetAtPath(path);
asset.assetBundleName = selected.name; //設置Bundle文件的名稱
asset.assetBundleVariant = "unity3d";//設置Bundle文件的擴展名
asset.SaveAndReimport();
}
AssetDatabase.Refresh();
}
調用函數:
// 所有打包操作需要在編輯器模式下,打包代碼也需要放在Editor文件夾下
// outputPath:輸出路徑,即工程目錄下面的路徑
// assetBundleOptions:AB包發佈選項.
// targetPlatform:選擇發佈平臺.
// Returns:返回一個包含發佈所有信息的AssetBundleManifest對象
const string outputPath = "Assets/StreamingAssets";
[MenuItem("AssetsBundle/CreateAssetBundle")]
static void CreateAssetbundle()
{
BuildPipeline.BuildAssetBundles(outputPath, 0,
EditorUserBuildSettings.activeBuildTarget);
AssetDatabase.Refresh();
}
BuildAssetBundleOptions:
- None:構建AssetBundle沒有任何特殊的選項
- UncompressedAssetBundle:不進行數據壓縮。沒有壓縮/解壓的過程,AssetBundle的發佈和加載會更快,但是AssetBundle也會更大,導致下載速度變慢。
- CollectDependencies:包括所有依賴關係的資源 (AssetBundle中所有類型的hash)
- DisableWriteTypeTree:在AssetBundle中不包含類型信息(TypeTree)。需要注意的是,如果要將AssetBundle發佈到Web平臺上,則不能使用該選項。
- DeterministicAssetBundle:使每個Object具有唯一不變的hash ID,使用ID可避免資源改名、移動位置等導致重新導出。 可用於增量式發佈AssetBundle。
- ForceRebuildAssetBundle:強制重新Build所有的AssetBundle。
- IgnoreTypeTreeChanges:忽略TypeTree的變化,不能與DisbaleTypeTree同時使用。
- AppendHashToAssetBundleName:附加Hash到AssetBundle名稱中。
- ChunkBasedCompression:使用LZ4壓縮算法來Build AssetBundle。默認LZMA壓縮。
- StrictMode:如果發佈過程中有任何錯誤報告就不允許發佈成功。
- DryRunBuild:獲得打包一個AssetBundle的AssetBundleManifest,AssetBundleManifest對象包含有效AssetBundle依賴性和散列。但是不實際創建AssetBundle。
- DisableLoadAssetByFileName:不允許AB包通過文件名加載資源。
- DisableLoadAssetByFileNameWithExtension:禁用通過使用擴展名加載AssetBundle。
調用該函數,unity會自動根據資源的標籤進行打包,而且是增量打包,
- 對於資源沒有變更的bundle包,不會觸發重新打包;
- 資源沒變,即使生成目錄下的bundle包被刪除了,unity也不會重新打包;
- 生成目錄下的bundle包對應的manifase被刪了,會重新打包;
- 可以使用BuildAssetBundleOptions.ForceRebuildAssetBundle參數觸發強制重新打包。
AssetBundleVariant:
設置AssetBundle的不同變體,比如常用的普清,高清版本。
Unity將對兩個AssetBundle中的資源使用同樣的ID,使它們支持在運行時切換。
設置變體之前,一定要設置前面的AssetBundle,不能是默認的None,代碼上邊有。
方式2-通過代碼手動設置打包AssetBundle
const string AssetBundlesOutputPath = "Assets/StreamingAssets";
[MenuItem("AssetsBundle/CreateAssetBundle")]
static void CreateAssetbundle1()
{
AssetBundleBuild tempAssetBundleBuild = new AssetBundleBuild();
tempAssetBundleBuild.assetBundleName = "myAssetBundle";
// abb.assetBundleVariant = "hd";
tempAssetBundleBuild.assetNames = new string[2] { @"Assets/SampleAssets/Logo/Logo.prefab", @"Assets/SampleAssets/Logo/UnityLogo/UnityLogo.png" };
BuildPipeline.BuildAssetBundles(AssetBundlesOutputPath,new AssetBundleBuild[1] { tempAssetBundleBuild },BuildAssetBundleOptions.None,EditorUserBuildSettings.activeBuildTarget);
AssetDatabase.Refresh();
}
1.一個AssetBundleBuild對應一個AssetBundle資源包。
2.如果需要在導出路徑下創建文件夾,然後在文件夾下創建AssetBundle,只需修改上邊代碼中的:
tempAssetBundleBuild.assetBundleName = "CustomFolderName/myAssetBundle";
3.用代碼手動設置打包AssetBundle,同名的.mainfest中不能自動收集此AssetBundle依賴的AssetBundle。
每個AssetBundle都對應一個同名.mainfest,.mainfest包含此AssetBundle中包含的資源。
設置AssetBundleName打包生成的同名.mainfest中有此AssetBundle依賴的AssetBundle資源路徑。
由於同名.mainfest只是在Unity Editor打包時候,做增量打包AssetBundle用,所以路徑使用的是本地絕對路勁。
參考:
https://blog.csdn.net/lodypig/article/details/51871510