[引擎]之四:unity中查看简单mesh顶点顺序的小工具——修改

本文介绍了一个Unity编辑器下的小工具,用于查看Mesh顶点的位置信息和UV坐标,并允许用户选择显示的内容。该工具能够处理顶点数与UV数不匹配的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里制作的小工具,功能有点单薄,只能查看顶点的顺序。
在写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) 最后

生产工具决定生产力。定制工具比不可少。之后还会根据需要进行工具的更新。
积跬步以至千里。

以上。

### UnityMesh 编程教程 在 Unity 中进行网格 (Mesh) 编程涉及多个方面,包括但不限于创建自定义几何形状、修改现有网格以及通过脚本动态改变这些对象。下面将详细介绍如何实现这一点。 #### 创建简单的三角形网格 为了理解基本概念,可以从最基础的图形——单个三角形开始: ```csharp using UnityEngine; public class TriangleCreator : MonoBehaviour { void Start() { MeshFilter mf = gameObject.AddComponent<MeshFilter>(); MeshRenderer mr = gameObject.AddComponent<MeshRenderer>(); Material material = new Material(Shader.Find("Standard")); mr.material = material; Vector3[] vertices = new Vector3[3]; int[] triangles = new int[3]; // 定义顶点位置 vertices[0] = new Vector3(-0.5f, 0); vertices[1] = new Vector3(0.5f, 0); vertices[2] = new Vector3(0, 1); // 设置索引顺序来形成面片 triangles[0] = 0; triangles[1] = 1; triangles[2] = 2; Mesh mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; mesh.RecalculateNormals(); mf.mesh = mesh; } } ``` 这段代码展示了如何构建一个由三个顶点组成的简单三角形,并将其应用到游戏对象上[^1]。 #### 修改现有的网格数据 对于更复杂的操作,比如调整已有模型上的某些部分,则可以访问 `Mesh` 类中的属性来进行更改。例如,可以通过编辑顶点数组或UV坐标来自定义纹理映射效果。 当涉及到高级功能如扭曲视图时,可利用着色器技术配合C#脚本来达到目的。具体来说,在不依赖额外资源的情况下,可以直接基于网格本身的法线信息和视角方向计算出所需的视觉变形效果[^2]。 #### 使用着色器增强网格表现力 针对特定需求,如创建具有特殊光学效应的对象(如上述提到的菲涅尔反射),编写自定义着色器可能是必要的。这通常意味着要学习HLSL/GLSL等低级渲染语言,不过Unity提供了内置节点式工具Shader Graph简化了这一过程。 综上所述,掌握Unitymesh编程不仅限于单纯的数据结构处理;它还涵盖了从底层硬件加速绘图指令集直至高层美术设计意图表达之间的广泛领域。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

延澈左

小小心意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值