0评论

Unity导入模型出现多层UV问题解决

文章来自https://blog.csdn.net/tc3819171/article/details/72853104 2019-02-22 1.5k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

在做项目优化的时候发现,游戏中的模型占用了很高的内存,然后就怀疑是美术在做模型的时候没有把uv2,uv3,color等无用的通道去掉,然后就去问了美术,美术说她并没有开启这些通道,我也去max中检查了一下也没发现什么异常的情况,在max中看确实只有一层uv但是在unity里面就可以看见模型上面有很多层uv了,带着这个问题去查了下资料,摸索着使用了下max,然后就有了下面给大家分享的Unity导入模型出现多层UV问题解决方法。

方法一:

在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问题的方法。

注:由于unity的光照贴图会自动占用uv2通道,而且你的项目中又使用的是动态加载光照贴图的方式的话,最好不要在导入模型的时候把UV2设置为null,如果你这样做了有可能会导致光照贴图显示不出来的问题。