Unity AssetBundle打包

1.方式1-設置AssetBundleName打包

  1. 設置AssetBundleName
  2. 調用打包函數。

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:

  1. None:構建AssetBundle沒有任何特殊的選項
  2. UncompressedAssetBundle:不進行數據壓縮。沒有壓縮/解壓的過程,AssetBundle的發佈和加載會更快,但是AssetBundle也會更大,導致下載速度變慢。
  3. CollectDependencies:包括所有依賴關係的資源 (AssetBundle中所有類型的hash)
  4. DisableWriteTypeTree:在AssetBundle中不包含類型信息(TypeTree)。需要注意的是,如果要將AssetBundle發佈到Web平臺上,則不能使用該選項。
  5. DeterministicAssetBundle:使每個Object具有唯一不變的hash ID,使用ID可避免資源改名、移動位置等導致重新導出。 可用於增量式發佈AssetBundle。
  6. ForceRebuildAssetBundle:強制重新Build所有的AssetBundle。
  7. IgnoreTypeTreeChanges:忽略TypeTree的變化,不能與DisbaleTypeTree同時使用。
  8. AppendHashToAssetBundleName:附加Hash到AssetBundle名稱中。
  9. ChunkBasedCompression:使用LZ4壓縮算法來Build AssetBundle。默認LZMA壓縮。
  10. StrictMode:如果發佈過程中有任何錯誤報告就不允許發佈成功。
  11. DryRunBuild:獲得打包一個AssetBundle的AssetBundleManifest,AssetBundleManifest對象包含有效AssetBundle依賴性和散列。但是不實際創建AssetBundle。
  12. DisableLoadAssetByFileName:不允許AB包通過文件名加載資源。
  13. DisableLoadAssetByFileNameWithExtension:禁用通過使用擴展名加載AssetBundle。

調用該函數,unity會自動根據資源的標籤進行打包,而且是增量打包

  1. 對於資源沒有變更的bundle包,不會觸發重新打包;
  2. 資源沒變,即使生成目錄下的bundle包被刪除了,unity也不會重新打包;
  3. 生成目錄下的bundle包對應的manifase被刪了,會重新打包;
  4. 可以使用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

http://www.cnblogs.com/sifenkesi/p/6880068.html

https://www.cnblogs.com/pinkfloyd/p/6489979.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章