实际情况:我们经常会在两个或者多个Prefab中使用同一份的贴图和材质,如果直接进行打包,则会打包两份贴图和材质,造成资源的冗余。同类型的资源,通常可以打包成一个bundle。
解决方法:我们可以直接在可能冗余的资源上输入AssetBundle的名字和后缀,然后进行打包,这样预设体会自动依赖材质和贴图。
我们都知道当我们创建AssetBundle时,会自动创建对应的Manifest文件(资源依赖关系文本),通过这个依赖关系文本我们可以查看一些内容:
ManifestFileVersion: 0
CRC: 3016748493
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 5d6fcb1542baac34dd0b8407dc2fd99b
TypeTreeHash:
serializedVersion: 2
Hash: 31d6cfe0d16ae931b73c59d7e0c089c0
HashAppended: 0
ClassTypes: []
Assets:
- Assets/Scenes/SceneBundle.unity
Dependencies: []
在Dependencies:[]中存放的就是对应的依赖关系。
使用脚本自动打包和处理依赖关系
现实情况:在游戏中一般游戏资源都是比较多,如果一个一个设置AssetBundle的名称和依赖就比较麻烦了,
因此我们也可以使用代码自动的进行打包,和处理对应的依赖关系。
对应的代码如下:
[MenuItem("Assets/Tools/SetAssetBundleDep")]
static void SetAssetBundleDep()
{
string outPath = Path.Combine(Application.dataPath,"StreamingAssets");//存放位置
if (Directory.Exists(outPath))//文件是否存在
{
Directory.Delete(outPath);
}
Directory.CreateDirectory(outPath);//创建一个新的路径
List<AssetBundleBuild> builds = new List<AssetBundleBuild>();
//设置Assetbundle的名字,将多个资源构建在同一个AssetBundle内
builds.Add(new AssetBundleBuild()
{
assetBundleName = "Cube",//bundle的名字
assetNames = new string[]{"Assets/Prefabs/Cube1.prefab", "Assets/Prefabs/Cube2.prefab" }//需要进行打包的资源的名字(需要提供完整的路径)
});
//依赖的资源单独打包
builds.Add(new AssetBundleBuild()
{
assetBundleName = "Mat",
assetNames=new string[] { "Assets/Prefabs/Mat.mat"}
});
//构建Assetbundle
BuildPipeline.BuildAssetBundles(outPath,builds.ToArray(),BuildAssetBundleOptions.ChunkBasedCompression,BuildTarget.Android);
//刷新
AssetDatabase.Refresh();