当前位置:   article > 正文

(二)AssetBundle的创建_buildassetbundles assetbundlebuild

buildassetbundles assetbundlebuild

BuildPipeline.BuildAssetBundles

BuildAssetBundle的完整定义为:

public static AssetBundleManifest BuildAssetBundles(stringoutputPath, BuildAssetBundleOptions assetBundleOptions =BuildAssetBundleOptions.None, BuildTarget targetPlatform =BuildTarget.WebPlayer)

具体步骤如下:

1.UnityAssets文件夹下选中一个资源,然后在其Inspector视图下方设置AssetBundle名称,如图所示。


2.Assets文件的Editor文件夹(如果文件夹不存在就创建一个)中创建一个c#脚本,并编辑如下:

  1. using UnityEngine;
  2. using UnityEditor;
  3. public class ExportAssetBundles : MonoBehaviour {
  4. [MenuItem("Custom Editor/Buile AssetBunldes")]
  5. static void CreateAssetBunldesMain()
  6. {
  7. //输出路径为Assets下的StreamingAssets文件夹(确定存在该路径)
  8. BuildPipeline.BuildAssetBundles("Assets/StreamingAssets");
  9. }
  10. }

3.保存编辑好的脚本,然后再单击菜单栏中Custom Editor→Build AssetBunldes选项,即可在输出的路径中看到打包的AssetBundle,脚本会对工程里面所有的AssetBundle进行打包,如图所示。


4.如果要将多个资源一起打包,只要将它们的AssetBundle名称设置成一样就可以了。

5.AssetBundle的增量式打包仅重新打包发生变化变化的AssetBundle,当Assets文件发生变化或TypeTree发生变化时才会重新打包。


BuildPipeline.BuildPlayer

BuildPlayer完整定义为:

public static stringBuildPlayer(string[] levels, string locationPathName, BuildTarget target,BuildOptions options)

参数

解释说明

levels

包括在build里的场景,如果空,当前打开的场景将被编译。路径是相对于项目文件夹(例:Assets/MyLevels/MyScene.unity)。

locationPathName

将被编译应用程序的路径,必须包括所有必要的文件扩展名。

target

用于指定要编译的BuildTarget。

options

额外的编译选项,多个选项可以组合在一起,例如是否运行哪种播放器。


示例代码:

  1. // Build a folder containing unity3d file and html file
  2. [MenuItem ("Build/BuildWebplayer")]
  3. static function MyBuild()
  4. {
  5. var levels : String[] = ["Assets/Scene1.unity", "Assets/Scene2.unity"];
  6. BuildPipeline.BuildPlayer( levels, "WebPlayerBuild",
  7. BuildTarget.WebPlayer, BuildOptions.None);
  8. }

BuildAssetBundleOptions选项

在创建AssetBundle文件的时候,Unity提供了若干个创建选项,每个选项的作用描述如下:

·      None

              构件AssetBundle没有任何特殊的选项。

·      DisableWriteTypeTree

在AssetBundle中不包含类型信息。需要注意的是,如果要将AssetBundle发布到Web平台上,则不能使用该选项。

·      DeterministicAssetBundle

使每个Object具有唯一不变的hash ID,可用于增量式发布AssetBundle。

·      UncompressedAssetBundle

不进行数据压缩。如果使用该选项,因为没有压缩/解压缩的过程,AssetBundle的发布和加载会更快,但是AssetBundle也会更大,导致下载速度变慢。

·      ForceRebuildAssetBundle

      强制重新Build所有的AssetBundle。

·      IngoreTypeTreeChanges

      忽略TypeTree的变化,不能与DisableTypeTree同时使用。

·      AppendHashToAssetBundleName

      附加Hash到AssetBundle名称中。

BuildTarget选项

      目标的构建平台。    

AssetBundle在不同平台之间是不完全兼容的,在多个独立平台构件(包括webplayer)的AssetBundle可以在这些平台上加载,但并不能在IOS和Android上加载,这需要单独

指定它们的BuildTarget。此外,Android和IOS之间也不能相互兼容。

 

Unity处理Assets之间的依赖

       在Unity5.0以后,Unity会自动处理Assets之间的依赖关系,并把这种依赖关系Build到AssetBundle之中,不再需要通过PopAssetDependencies()/PushAssetDependencies()来处理依赖关系,Unity处理Assets的依赖的关系如图所示。


Unity提供了Manifest文件向用户展示这些依赖关系,在处理Assets的依赖关系时不再需要重新打包整个依赖链。例如:

  • Cube→Material→Texture。
  • Cube.unity3d→material.unity3d。
  • 更新Material的Texture。
  • 只需重新打包material.unity3d即可。

在Editor模式下,Unity为每个AssetBundled都会生成一个Manifest文件,在

Manifest文件中包含:

  • CRC
  • 所包含的Assets
  • 所依赖的AssetBundles
  • Hash
  • ClassTypes

   AssetBundle Manifest提供了以下访问接口:

  • GetAllAssetBundles()  : 获取所有的AssetBundles的Manifest。
  • GetAllAssetBundlesWithVariant() 获取所有Variant的AssetBundles的Manifest。
  • GetAllDependencies(string) 获取给定AssetBundle所依赖的AssetBundles。
  • GetAssetBundleHash(string) 获取给定AssetBundle的Hash。
  • GetDirectDependencies(string) 获取给定AssetBundle直接依赖的AssetBundles。

AssetBundle Manifest示例:

  1. //manifestPath为manifest文件路径.
  2. WWW wwwManifest = new WWW(manifestPath);
  3. yield return wwwManifest;
  4. AssetBundle manifestBundle = wwwManifest.assetBundle;
  5. AssetBundleManifest manifest = (AssetBundleManifest)manifestBundle.LoadAsset("AssetBundleManifest");
  6. manifestBundle.Unload(false);
  7. string[] allAssetBundles = manifest.GetAllAssetBundles();
  8. //assetBundleName为assetbundle名称.
  9. string[] depedentAssetBundles = manifest.GetAllDependencies(assetBundleName);

在对资源打包自后,在输出的路径文件下会有一个总的manifest文件, 文件名与文件所在的文件夹名称相同 ,然后每一个打包的资源分别会有一个自己的manifest文件。总的manifest文件内容如图所示: 


  • Name:表示AssetBundle的名称。
  • Dependencies:表示该AssetBundle所依赖的AssetBundle,如果内容为空,则说明该AssetBundle没有依赖的AssetBundle。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/92032
推荐阅读
相关标签
  

闽ICP备14008679号