最近在做项目优化的时候发现,游戏中的模型占用了很高的内存,然后就怀疑是美术在做模型的时候没有把uv2,uv3,color等无用的通道去掉,然后就去问了美术,美术说她并没有开启这些通道,我也去max中检查了一下也没发现什么异常的情况,在max中看确实只有一层uv但是在unity里面就可以看见模型上面有很多层uv了,带着这个问题去查了下资料,摸索着使用了下max,找到了如下的两种解决方法。
方法一:
在max中进行设置把没有必要的通道全部clear掉,具体的操作请看下面的截图:
在这个界面中美术可以把相应的不需要的通道关掉,这样在导出的时候就不会附带这些通道了,如果想去掉color通道的话直接去掉alpha通道就行。
方法二:
程序这边进行处理,做一个工具,对每个导入到unity中的模型代码中清除相应的通道,具体的代码如下
public class ClearModelUV:AssetPostprocessor { //AssetPostprocessor这个类是unity自带的,会在导入资源的时候自动调用, //可以在这个类中实现对资源的处理。 //OnPostprocessModel这个函数在资源导入到unity被存成prefabs最后阶段被调用 //传入的gameobject就是被导入的资源的Gameobject //这个类还有一个OnPreprocessModel的方法会比这个方法提前点调用。具体用法 //和前者差不多 void OnPostprocessModel(GameObject rImaportModel) { this.ClearMeshUVAndColorChannel(rImaportModel); } private void ClearMeshUVAndColorChannel(GameObject rImportModel) { List<Vector2> rNewUV = null; List<Color32> rNewColor = null; var rFilters= rImportModel.GetComponentsInChildren<MeshFilter>(); for (int filter_index = 0; filter_index < rFilters.Length; filter_index++) { rFilters[filter_index].sharedMesh.SetColors(rNewColor); rFilters[filter_index].sharedMesh.SetUVs(1, rNewUV); rFilters[filter_index].sharedMesh.SetUVs(2, rNewUV); rFilters[filter_index].sharedMesh.SetUVs(3, rNewUV); } } }以上就是解决导入的模型存在多层UV的解决方法。
Tip:由于unity的光照贴图会自动占用uv2通道,而且你的项目中又使用的是动态加载光照贴图的方式的话,最好不要在导入模型的时候把UV2设置为null,如果你这样做了有可能会导致光照贴图显示不出来的问题。具体请看http://m.blog.csdn.net/article/details?id=46330119我也是搜索解决方案的时候无意中看到的,所以作为Tips提醒下