本文已参与「新人创作礼」活动,一起开启掘金创作之路。
场景全部网格数据:顶点数约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