BuildPipeline.BuildAssetBundles
BuildAssetBundle的完整定义为:
public static AssetBundleManifest BuildAssetBundles(stringoutputPath, BuildAssetBundleOptions assetBundleOptions =BuildAssetBundleOptions.None, BuildTarget targetPlatform =BuildTarget.WebPlayer)
具体步骤如下:
1.在Unity的Assets文件夹下选中一个资源,然后在其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。