這裏製作的小工具,功能有點單薄,只能查看頂點的順序。
在寫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中添加是否顯示信息的選項,就是這樣:
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效果:
(5) 最後
生產工具決定生產力。定製工具比不可少。之後還會根據需要進行工具的更新。
積跬步以至千里。
以上。