[引擎]之四:unity中查看簡單mesh頂點順序的小工具——修改

這裏製作的小工具,功能有點單薄,只能查看頂點的順序。
在寫CubeMesh的時候,需要查看頂點的位置信息和uv信息。
因此,添加這兩個功能:

(1) 添加查看頂點位置和uv信息

MeshViewerEditor中,添加兩個方法,來顯示頂點位置信息和uv信息。因爲目前只會在簡單的mesh查看時用到,所以不必太考慮性能什麼的,先有再追求。以下是新加的代碼:

        // 顯示頂點位置Str
        private void AddVerticeStr(ref StringBuilder sb, Vector3 vert)
        {
            sb.Append(",vertice:" + vert);
        }
        // 顯示uv信息Str
        private void AddUVStr(ref StringBuilder sb,Vector2 uv)
        {
            sb.Append(",uv:" + uv);
        }

(2) 兼容頂點數量和uv數量不同的情況

在新建Mesh的過程中,先添加頂點,之後纔會給每個頂點添加uv座標。所以,有可能uv座標的數量和頂點數量不一致。這個時候,兼容一下。修改顯示uv信息的方法:

        private void AddUVStr(ref StringBuilder sb, ref List<Vector2> uvList, int index)
        {
            if (uvList.Count > index)
            {
                sb.Append(",uv:" + uvList[index]);
            }
        }

嗯,完成了,看一下運行效果:
運行效果

(3) 添加是否顯示信息的選項

有時候,希望只看頂點信息或者uv信息什麼的,不要全部顯示。
所以,在Inspector中添加是否顯示信息的選項,就是這樣:
Inspector中的顯示
Unity中的Editor類,重寫OnInspectorGUI()方法,添加自己想要的選項。代碼如下:

        private bool showInfo = true;
        private bool showUV = true;
        private bool showVertice = true;
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            showInfo = GUILayout.Toggle(showInfo, "Show Info");
            showVertice = GUILayout.Toggle(showVertice, "Show Vertice");
            showUV = GUILayout.Toggle(showUV, "Show UV");

        }

然後使用這幾個布爾值就可以了。

(4) 完整代碼

using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.Text;
namespace YanCheZuo
{
    [CustomEditor(typeof(TestMeshViewer))]
    public class MeshViewerEditor : Editor
    {
        private bool showInfo = true;
        private bool showUV = true;
        private bool showVertice = true;
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            showInfo = GUILayout.Toggle(showInfo, "Show Info");
            showVertice = GUILayout.Toggle(showVertice, "Show Vertice");
            showUV = GUILayout.Toggle(showUV, "Show UV");

        }
        private void OnSceneGUI()
        {
            if (!showInfo)
            {
                return;
            }
            GUIStyle style = new GUIStyle();
            style.normal.textColor = Color.red;
            TestMeshViewer viewer = target as TestMeshViewer;
            Dictionary<Vector3, StringBuilder> posList = new Dictionary<Vector3, StringBuilder>();

            for (int i = 0, imax = viewer.verticesList.Count; i < imax; ++i)
            {
                Vector3 vPos = viewer.transform.TransformPoint(viewer.verticesList[i]);
                StringBuilder sb;
                if (posList.TryGetValue(vPos, out sb))
                {
                    StringBuilder str = new StringBuilder("index:" + i);
                    AddVerticeStr(ref str, vPos);
                    AddUVStr(ref str, ref viewer.uvList, i);
                    sb.AppendLine(str.ToString());
                }
                else
                {
                    sb = new StringBuilder();
                    StringBuilder str = new StringBuilder("index:" + i);
                    AddVerticeStr(ref str, vPos);
                    AddUVStr(ref str, ref viewer.uvList, i);
                    sb.AppendLine(str.ToString());
                    posList.Add(vPos, sb);
                }

                Handles.Label(vPos, sb.ToString(), style);
            }
        }

        private void AddVerticeStr(ref StringBuilder sb, Vector3 vert)
        {
            if (!showVertice)
            {
                return;
            }
            sb.Append(",vertice:" + vert);
        }
        private void AddUVStr(ref StringBuilder sb, ref List<Vector2> uvList, int index)
        {
            if (!showUV)
            {
                return;
            }

            if (uvList.Count > index)
            {
                sb.Append(",uv:" + uvList[index]);
            }
        }
    }
}

只看index和uv效果:
index_uv效果

(5) 最後

生產工具決定生產力。定製工具比不可少。之後還會根據需要進行工具的更新。
積跬步以至千里。

以上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章