夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityで選択したオブジェクトのポリゴン数をギズモとして表示する その②太文字にする

本日はUnity枠です。昨日はUnityのシーンビューで選択したオブジェクトのポリゴン数が画面上に描画される機能を作りました。

今回は先日の機能を改良していきます。

〇太文字にする

先日の段階では文字が小さく見えにくい問題がありました。

こちらを見やすいように太文字にします。

これを行うためにはGUIStyleを使用します。GUIStyleはその名の通りUnityのGUI上のレイアウトやスタイルを格納するクラスです。

    static GUIStyle style;
    static PolygonCounter()
    {
        SceneView.onSceneGUIDelegate += OnSceneGUI;
        style = new GUIStyle();
        style.normal.textColor = Color.white; // 文字の色
        style.fontStyle = FontStyle.Bold; // フォントのスタイル
    }

太文字にするためにはFontStyle.Boldを使用することで行えます。

これを反映するためにはGUILayout.Label()の第二引数にStyleを使用して適応します。

                GUILayout.Label("Polygon Count: " + polygonCount,style);

これによって表示が太文字になります。

〇ポリゴン数によって色を変える。

次にポリゴン数によって色を変えていきます。

これを行うためにはあらかじめ2種の色を宣言します。

  static GUIStyle style;
    static Color normalColor = Color.white; 
    static Color highPolyColor = Color.yellow; 
   

次にポリゴン数を取得した後その値に応じて条件分岐で使用するスタイルの色を分けます。

今回は1000ポリゴンを基準に黄色になるようにしました。

int polygonCount = meshFilter.sharedMesh.triangles.Length / 3;
                style.normal.textColor = polygonCount >= 1000 ? highPolyColor : normalColor;
                Handles.BeginGUI();
                GUILayout.Label("Polygon Count: " + polygonCount,style);
                Handles.EndGUI();

これを実行すると1000ポリゴンを越えたオブジェクトを選択すると黄色く表示されるようになりました。

以上でより見やすくなりました。

本日は以上です。

〇コード全文

using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class PolygonCounter
{
    static GUIStyle style;
    static Color normalColor = Color.white; 
    static Color highPolyColor = Color.yellow; 
    static PolygonCounter()
    {
        SceneView.onSceneGUIDelegate += OnSceneGUI;
        style = new GUIStyle();
     
        style.fontStyle = FontStyle.Bold; // フォントのスタイル
        style.fontSize = 14; // フォントサイズ
        style.wordWrap = true;
    }

    static void OnSceneGUI(SceneView sceneView)
    {
        if (Selection.activeGameObject != null)
        {
            GameObject selectedObject = Selection.activeGameObject;
            MeshFilter meshFilter = selectedObject.GetComponent<MeshFilter>();
            if (meshFilter != null)
            {
                int polygonCount = meshFilter.sharedMesh.triangles.Length / 3;
                style.normal.textColor = polygonCount >= 1000 ? highPolyColor : normalColor;
                Handles.BeginGUI();
                GUILayout.Label("Polygon Count: " + polygonCount,style);
                Handles.EndGUI();
            }
        }
    }
}