【UnityEditor】查看模型Mesh面数/顶点数

2,936 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

场景全部网格数据:顶点数约3.7k,三角面数2.0k 统计到的模型网格数据:顶点数3626,三角面数1987,

绘制的GUI占用的网格数据:顶点数56,三角面数约30

Unity默认天空盒占用网格数据:顶点数5040,三角面数约1.7k

测试时去掉了天空盒,只有GUI和目标模型,56 + 3626 ~= 3.7k 去掉GUI字体的顶点数和三角面数,统计到的数据与Unity面板显示一致。 如果使用了天空盒,需要额外注意天空盒网格数据。

关键步骤:

  • Selection.selectionChanged:编辑器下当前选中的Gameobject发生变化的回调
  • Selection.gameObjects:编辑器下当前选中的Gameobject
  • 获取所有网格数据:
    • Gameobject.GetComponentsInChildren():获取自身节点及所有嵌套下属节点的MeshFilter组件
    • Gameobject.GetComponentsInChildren():获取自身节点及所有嵌套下属节点的SkinnedMeshRenderer组件
  • 统计网格数据:
    • MeshFilter.sharedMesh.triangles.Length(MeshFilter三角面数)
    • MeshFilter.sharedMesh.vertexCount(MeshFilter顶点数)
    • SkinnedMeshRenderer.sharedMesh.triangles.Length(SkinnedMeshRenderer三角面数)
    • SkinnedMeshRenderer.sharedMesh.vertexCount(SkinnedMeshRenderer顶点数)

示例统计代码:

#if UNITY_EDITOR

//**************************************************
//* FileName:          CalculateMeshTris.cs
//* Author:            ZCS
//* Version:           1.0
//* CreateTime:        2021/07/16 16:17:09
//**************************************************

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class CalculateMeshTris : MonoBehaviour
{
    [SerializeField] private bool active = true;

    private int verts;
    private int tris;

    private GUIStyle textStyle = new GUIStyle();

    private void Awake()
    {
        textStyle.normal.background = null;
        textStyle.normal.textColor = new Color(1.0f,0.5f,0.0f);
        textStyle.fontSize = 30;
    }

    private void OnEnable()
    {
        if(active)
        {
            Selection.selectionChanged += CalculateVertsAndTris;
            CalculateVertsAndTris();
        }
    }
    private void OnDisable()
    {
        Selection.selectionChanged -= CalculateVertsAndTris;
    }

    private void CalculateVertsAndTris()
    {
        GameObject[] objs = Selection.gameObjects;

        int verts1 = 0, tris1 = 0, verts2 = 0, tris2 = 0;

        foreach(GameObject obj in objs)
        {
            //MeshRenderer网格
            MeshFilter[] filters = obj.GetComponentsInChildren<MeshFilter>();
            foreach(MeshFilter filter in filters)
            {
                tris1 += filter.sharedMesh.triangles.Length;
                verts1 += filter.sharedMesh.vertexCount;
            }

            //SkinnedMeshRenderer网格
            SkinnedMeshRenderer[] renders = obj.GetComponentsInChildren<SkinnedMeshRenderer>();
            foreach(SkinnedMeshRenderer render in renders)
            {
                tris2 += render.sharedMesh.triangles.Length;
                verts2 += render.sharedMesh.vertexCount;
            }
        }
        tris1 /= 3;
        tris2 /= 3;

        verts = verts1 + verts2;
        tris = tris1 + tris2;

        if(verts > 0 && tris > 0)
            Debug.Log(string.Format("verts: {0}+{1}={2}; tris: {3}+{4}={5}",verts1,verts2,verts,tris1,tris2,tris));
    }

    private void OnGUI()
    {
        if(active)
            GUILayout.Label(string.Format("verts: {0}; tris: {1}",verts,tris),textStyle);
    }
}

#endif