1.方式1-设置AssetBundleName打包
- 设置AssetBundleName
- 调用打包函数。
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:
- None:构建AssetBundle没有任何特殊的选项
- UncompressedAssetBundle:不进行数据压缩。没有压缩/解压的过程,AssetBundle的发布和加载会更快,但是AssetBundle也会更大,导致下载速度变慢。
- CollectDependencies:包括所有依赖关系的资源 (AssetBundle中所有类型的hash)
- DisableWriteTypeTree:在AssetBundle中不包含类型信息(TypeTree)。需要注意的是,如果要将AssetBundle发布到Web平台上,则不能使用该选项。
- DeterministicAssetBundle:使每个Object具有唯一不变的hash ID,使用ID可避免资源改名、移动位置等导致重新导出。 可用于增量式发布AssetBundle。
- ForceRebuildAssetBundle:强制重新Build所有的AssetBundle。
- IgnoreTypeTreeChanges:忽略TypeTree的变化,不能与DisbaleTypeTree同时使用。
- AppendHashToAssetBundleName:附加Hash到AssetBundle名称中。
- ChunkBasedCompression:使用LZ4压缩算法来Build AssetBundle。默认LZMA压缩。
- StrictMode:如果发布过程中有任何错误报告就不允许发布成功。
- DryRunBuild:获得打包一个AssetBundle的AssetBundleManifest,AssetBundleManifest对象包含有效AssetBundle依赖性和散列。但是不实际创建AssetBundle。
- DisableLoadAssetByFileName:不允许AB包通过文件名加载资源。
- DisableLoadAssetByFileNameWithExtension:禁用通过使用扩展名加载AssetBundle。
调用该函数,unity会自动根据资源的标签进行打包,而且是增量打包,
- 对于资源没有变更的bundle包,不会触发重新打包;
- 资源没变,即使生成目录下的bundle包被删除了,unity也不会重新打包;
- 生成目录下的bundle包对应的manifase被删了,会重新打包;
- 可以使用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