现在使用的Unity制作的游戏基本上都在使用AssetBundle,但是AssetBundle有很多坑,一个比较常见的坑就是会使包体变大,而且占用的内存和显存都会变高。
把shader和模型分开打包就是为了解决这个问题,关于这个问题的详细说明可以参考这篇文章:http://gad.qq.com/article/detail/37547,但是这篇文章有些问题和我的实测不符(可能是版本的问题)
1.GraphicsSetting-> always included shader
这个选项无论是依赖打包还是非依赖打包都不需要设置
2.没有说明怎么把shader和模型采用依赖的方式打包
由于2017版本对打包进行了简化,不能在直接使用脚本进行依赖设置,而是通过先后顺序产生关联,Unity会自动检测资源之间的关联关系(不需要再手动设置)。所以有依赖关系的资源打包除了先后顺序之外还要注意的一点就是必须通过AssetBundleBuild数组一次性传给BuildPipeline.BuildAssetBundles(也就是说不能像非依赖打包一样每个资源可以单独调用BuildPipeline.BuildAssetBundles来单独打包一个文件)
List<AssetBundleBuild> builds = new List<AssetBundleBuild>();
builds.AddRange(GetBuildMap("Shader", true));
builds.AddRange(GetBuildMap("Character/Female/Model/Cloth", false));
builds.AddRange(GetBuildMap("Character/Female/Model/Hair", false));
BuildAssetBundleOptions option = BuildAssetBundleOptions.ChunkBasedCompression |
BuildAssetBundleOptions.ForceRebuildAssetBundle;
BuildPipeline.BuildAssetBundles(_bundlePath, builds.ToArray(), option, EditorUserBuildSettings.activeBuildTarget);
3.怎么在编辑器模式正常显示模型
只需要在游戏启动时就加载shader包,然后在加载对应模型的时候重新制定以下shader就行了
#if UNITY_EDITOR
var renders = gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
foreach (var r in renders) {
for (int n = 0; n < r.sharedMaterials.Length; ++n) {
Material mat = r.sharedMaterials[n];
var shaderName = mat.shader.name;
var newShader = Shader.Find(shaderName);
if (newShader != null) {
mat.shader = newShader;
}
else {
Debug.LogWarning("unable to refresh shader: " + shaderName + " in material " + mat.name);
}
}
}
#endif