(二)AssetBundle的创建

BuildPipeline.BuildAssetBundles

BuildAssetBundle的完整定义为:

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

具体步骤如下:

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


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

using UnityEngine;
using UnityEditor;
public class ExportAssetBundles : MonoBehaviour {

    [MenuItem("Custom Editor/Buile AssetBunldes")]
    static void CreateAssetBunldesMain()
	{
     //输出路径为Assets下的StreamingAssets文件夹(确定存在该路径)
            BuildPipeline.BuildAssetBundles("Assets/StreamingAssets");
    }
}

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

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


示例代码:

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

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示例:

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

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


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值