Created
June 4, 2020 09:25
-
-
Save kankikuchi/74875bcf0bd003eb235f1050a189660c to your computer and use it in GitHub Desktop.
シーン上のモデルを検索しポリゴン数が多い順に表示するエディタ拡張【Unity】【エディタ拡張】
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// PolygonsSearcher.cs | |
// http://kan-kikuchi.hatenablog.com/entry/PolygonsSearcher | |
// | |
// Created by kan.kikuchi on 2020.05.28. | |
using UnityEditor; | |
using UnityEngine; | |
using System.Linq; | |
using System.Collections.Generic; | |
/// <summary> | |
/// シーン上のモデルを検索しポリゴン数が多い順に表示するクラス | |
/// </summary> | |
public class PolygonsSearcher : EditorWindow { | |
//スクロール位置 | |
private Vector2 _scrollPosition = Vector2.zero; | |
//検索結果 | |
private readonly List<SearchResult> _resultList = new List<SearchResult>(); | |
//================================================================================= | |
//初期化 | |
//================================================================================= | |
//メニューからウィンドウを表示 | |
[MenuItem("Tools/Open/Polygons Searcher")] | |
public static void Open (){ | |
PolygonsSearcher.GetWindow (typeof(PolygonsSearcher)); | |
} | |
//================================================================================= | |
//表示するGUIの設定 | |
//================================================================================= | |
private void OnGUI(){ | |
_scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition, GUI.skin.scrollView); | |
//検索開始ボタン | |
if (GUILayout.Button("検索")) { | |
Search(); | |
} | |
if (_resultList.Count > 0) { | |
//合計ポリゴン数 | |
EditorGUILayout.LabelField($"ポリゴン数の合計 : {_resultList.Sum(result => result.TotalTriangleCount)}"); | |
//各検索結果の表示 | |
EditorGUILayout.BeginVertical(GUI.skin.box); | |
_resultList.ForEach(ShowResultGUI); | |
EditorGUILayout.EndVertical(); | |
} | |
EditorGUILayout.EndScrollView(); | |
} | |
//検索結果を元にGUIを表示 | |
private void ShowResultGUI(SearchResult result) { | |
EditorGUILayout.BeginVertical(GUI.skin.box); | |
//ポリゴン数、対象のメッシュ名表示 | |
EditorGUILayout.LabelField($"{result.TotalTriangleCount} ({result.TriangleCount} × {result.TargetObjectList.Count}) : {result.Mesh.name}"); | |
//メッシュが付いてるオブジェクト名のボタン表示 | |
EditorGUI.indentLevel++; | |
EditorGUILayout.BeginVertical(GUI.skin.box); | |
foreach (var target in result.TargetObjectList) { | |
if (target == null) { | |
continue; | |
} | |
//ボタンを押したらHierarchy上で選択するように | |
if (GUILayout.Button(target.name)) { | |
Selection.activeGameObject = target; | |
} | |
} | |
EditorGUILayout.EndVertical(); | |
EditorGUI.indentLevel--; | |
EditorGUILayout.EndVertical(); | |
} | |
//================================================================================= | |
//検索 | |
//================================================================================= | |
//検索 | |
private void Search() { | |
_resultList.Clear(); | |
//シーン上の有効なMeshFilterを検索し、検索結果を作成 | |
foreach (var meshFilter in FindObjectsOfType<MeshFilter>()) { | |
CreateResult(meshFilter.sharedMesh, meshFilter.gameObject); | |
} | |
//シーン上の有効なSkinnedMeshRendererを検索し、検索結果を作成 | |
foreach (var skinnedMeshRenderer in FindObjectsOfType<SkinnedMeshRenderer>()) { | |
CreateResult(skinnedMeshRenderer.sharedMesh, skinnedMeshRenderer.gameObject); | |
} | |
//累計のポリゴン数が多い順にソート | |
_resultList.Sort((a, b) => b.TotalTriangleCount - a.TotalTriangleCount); | |
} | |
//検索結果を作成 | |
private void CreateResult(Mesh mesh, GameObject target) { | |
if (mesh == null) { | |
return; | |
} | |
//同じMeshの結果がなけらば作成 | |
var result = _resultList.FirstOrDefault(searchResult => searchResult.Mesh == mesh); | |
if (result == null) { | |
result = new SearchResult(mesh); | |
_resultList.Add(result); | |
} | |
//オブジェクト設定 | |
result.TargetObjectList.Add(target); | |
} | |
//検索結果 | |
private class SearchResult { | |
//対象のメッシュ | |
public Mesh Mesh { get; set; } | |
public int TriangleCount => Mesh.triangles.Length / 3; | |
public int TotalTriangleCount => Mesh.triangles.Length / 3 * TargetObjectList.Count; | |
//対象のメッシュが付いてるオブジェクト | |
public List<GameObject> TargetObjectList { get; set; } = new List<GameObject>(); | |
public SearchResult(Mesh mesh) { | |
Mesh = mesh; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment