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

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