MeshBaker插件动态网格合并

由于公司美术比较菜,模型制作方面不仅被客户各种吐槽,研发这边也是头疼不已。模型优化做的不够,随便一个小场景,Drallcall就飙到1200,比较无奈。好在网上找到了一个插件MeshBaker,简直是神器。做个记录,免得下次忘记。
由于我的项目场景是动态变化,随时加载的,所以需要在加载场景时,实时对场景模型进行网格的优化,处理方法如下,在bundel读取完场景后,获取场景预设中所有的包含MeshRender的物体,交给MeshBaker进行处理,我在处理的时候发现,网格合并完,原有的碰撞体还保留在原来的场景上,所以建议只对静态的场景做网格合并操作,动态的模型还没研究,后续有时间再研究一下



    /// <summary>

    /// 使用meshBaker处理静态基础场景

    /// </summary>

    /// <param name="_base">Base.</param>

    public static void BaseSceneBaker(GameObject _base)

    {

        GameObject _meshBaker = new GameObject ("MeshBaker");

        _meshBaker.AddComponent <MB3_MultiMeshBaker>();

        MB3_MultiMeshBaker _baker = _meshBaker.GetComponent<MB3_MultiMeshBaker> ();

        MeshRenderer[] _renders = _base.GetComponentsInChildren<MeshRenderer> ();

        List<GameObject> _toLoadObjects = new List<GameObject> ();

        for (int j = 0; j < _renders.Length; j++) {

            MeshFilter _filter = _renders [j].GetComponent<MeshFilter> ();

            if (_filter&&_filter.mesh) {

                _toLoadObjects.Add (_renders [j].gameObject);

            }

        }

        _baker.AddDeleteGameObjects (_toLoadObjects.ToArray(), null,true);

        _baker.Apply ();



    }



    /// <summary>

    /// 删除上次创建的meshBaker

    /// </summary>

    public static void DeleteMeshHandler()

    {

        GameObject _meshBaker = GameObject.Find ("MeshBaker");

        GameObject _meshBakerObject = GameObject.Find ("CombinedMesh-MeshBaker");

        if (_meshBaker) {

            Destroy (_meshBaker);

        }

        if (_meshBakerObject) {

            Destroy (_meshBakerObject);

        }

    }


使用MeshBaker处理后,监控一下Dc,果然有显著下降,我拿的示例场景Dc的降低比例大概达到60%,确实是个很好用的工具。

这里还要解释一下,为什么第一个方法里针对MeshFilter做了一个判断,是因为在实测的时候,发现如果包含MeshRender的物体,没有MeshFilter的时候,会合并失败,所以只好加了一层判断。

猜你喜欢

转载自blog.csdn.net/sinat_28962939/article/details/86479775
今日推荐