最近在做项目优化的时候发现,游戏中的模型占用了很高的内存,然后就怀疑是美术在做模型的时候没有把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提醒下