[Unity实战]自定义mesh

参考链接:http://blog.csdn.net/zuoyamin/article/details/9287507

对于自定义mesh,有三点很重要:

1.顶点个数=三角形数+2;三角形顶点数=3*三角形数

2.顶点创建的顺序最好是顺时针或者逆时针创建的,这样可以大大地减少算法的复杂度

3.顶点绘制的顺序必须是顺时针或者逆时针绘制的,这样才能正确地绘制以顶点为边界点的图形,顶点绘制的顺序参考mesh.triangles

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CustomMesh : MonoBehaviour {

}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;

//使用前最好先锁定Inspector面板!
[CustomEditor(typeof(CustomMesh))]
public class CustomMeshEditor : Editor {

    private List<Vector3> vertices = new List<Vector3>();
    private int[] triangles;

    void OnSceneGUI()
    {
        CustomMesh customMesh = (CustomMesh)target;

        for (int i = 0; i < vertices.Count; i++)
        {
            Handles.PositionHandle(vertices[i], Quaternion.identity);
            Handles.Label(vertices[i], i.ToString());
        }
        if (vertices.Count > 1)
        {
            Handles.DrawPolyLine(vertices.ToArray());
            Handles.DrawLine(vertices[vertices.Count - 1], vertices[0]);
        }     

        //在OnSceneGUI()中只能通过Handles来绘制新视图
        //如果你想引入GUI的元素哪么就需要使用BeginGUI()和EndGUI()组合的使用。
        Handles.BeginGUI();
        GUILayout.BeginArea(new Rect(0, 0, 100, 100));

        if (GUILayout.Button("创建点"))
        {
            vertices.Add(customMesh.transform.position);
        }
        if (GUILayout.Button("撤销点"))
        {
            vertices.RemoveAt(vertices.Count - 1);
        }
        if (GUILayout.Button("导出mesh"))
        {
            Mesh mesh = new Mesh();

            int triangleAmount = vertices.Count - 2;
            triangles = new int[3 * triangleAmount];

            //根据三角形的个数,来计算绘制三角形的顶点顺序(索引)
            //顺序必须为顺时针或者逆时针
            for (int i = 0; i < triangleAmount; i++)
            {
                triangles[3 * i] = 0;//固定第一个点
                triangles[3 * i + 1] = i + 1;
                triangles[3 * i + 2] = i + 2;
            }

            mesh.vertices = vertices.ToArray();
            mesh.triangles = triangles;

            AssetDatabase.CreateAsset(mesh, "Assets/CustomMesh.asset");
        }
        GUILayout.EndArea();
        Handles.EndGUI();
    }
}

时间: 2024-12-30 23:17:43

[Unity实战]自定义mesh的相关文章

Unity 脚本自定义Mesh物体形状

今天研究了一下Unity的Mesh和自定义创建一个正方体和圆形. 参考:https://www.youtube.com/watch?v=IYMQ2ErFz0s http://www.bubuko.com/infodetail-1843291.html 在自定义Mesh本质上就是定义好你需要绘制图形的点vertices,然后根据这些点来画三角形triangles,再定义好uv(主要用来显示贴图)的坐标系就可以了. 就不多说了,其实可以直接先看第一个参考,在第一个参考的理解下去看第二个参考就可以用M

实战:自定义脚本启动mysql-mysql 5.6.19

根据工作环境,自定义一个mysql启动脚本 ---1.保存为/usr/local/mysql/scripts/mysql_env.ini #set mysql init variablesMYSQL_USER=system #mysql的用户名MYSQL_PASS='password' #mysql的登录用户密码 #check input parameter or noif [ $# -ne 1 ] ; then #判断输入的参数个数echo "mysql port is 3306"M

实战:自定义脚本关闭mysql-mysql 5.6.19

根据工作环境,自定义一个mysql关闭脚本 ---1.保存为/usr/local/mysql/scripts/mysql_env.ini #set mysql init variablesMYSQL_USER=system   #mysql的用户名MYSQL_PASS='password'  #mysql的登录用户密码 #check input parameter or noif [ $# -ne 1 ] ; then     #判断输入的参数个数 echo "mysql port is 330

关于Unity实现自定义多边形图片效果

关于Unity实现自定义多边形图片效果 1.创建RawImageEditor编辑器拓展脚本(放在工程中Editor文件夹下,没有则创建) 1 /************************************************* 2 * 项目名称:动态更改图片显示边数 3 * 脚本创建人:魔卡 4 * 脚本创建时间:2018.01.27 5 * 脚本功能:RawImageEditor编辑器功能重写 6 * **************************************

Unity自定义mesh以及编译器

Star 自定义编辑器简易教程 an introduction to custom editors 原文地址 http://catlikecoding.com/unity/tutorials/star/ http://blog.csdn.net/lilanfei/article/details/7680802 简介 Introduction 这个教程将让你学会如何创建一个星型控件以及如何制作这个控件的自定义编辑器.你将学会: 动态的建立Mesh. 使用一个嵌套类. 建立一个自定义编辑器. 使用S

Unity NGUI UIPanel下对粒子或自定义Mesh的剪裁

写在开篇: 越来越烦那些无脑转发自己不做验证的博主论坛楼主,网上好不容易找到一些资料,结果代码搞下来却是错的,有些确实是因为版本问题太老不兼容,但是有些明显是有问题的,转发前自己试试就知道肯定是不能用的.结果...哎...真是不想说啥了. 这次是在小地图中画线画圈,用到了动态绘制Mesh,小地图需要对这些线进行裁切,所以去网上搜了一篇叫做<Unity NGUI UIPanel下对粒子的剪裁>的文章.当然还是感谢一下原作者提供的思路.我这里对这篇文章中涉及到的代码进行了优化改动,使之可以使用.没

unity中自定义鼠标样式

在用unity制作游戏过程中,运行游戏时,有没有感觉到原来的鼠标看着是不是特别不爽了?反正我是看腻了,哈哈! 下面来看看自定义鼠标样式的自作:首先你需要在unity中将图片的样式改为Cursor类型的: 然后我们来看看代码: public Texture2D cursorTexture;    //在外面为该变量赋值; void OnGUI() {      Vector2 mouse_Pos=Input.MousePosition;      GUI.DrawTexture(new Rect(

unity发布自定义分辨率

如果你需要发布unity时想要使用自己设置的分辨率仅需要一下几个步骤: 打开Build Setting->PlayerSetting->Resolution and Presentation->取消勾选Default is full sceen选项并设置你自己设置的分辨率,选择Display Resolution Dialog为disable->在程序Awake中记得使用:Screen.SetResolution(1024, 768, false).

Unity UGUI自定义树形菜单(TreeView)

先上几张效果图:          如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三角形按钮),可以收缩或展开它的子元素: 3.可以单独判断某一元素的复选框是否被勾选,或者直接获取当前树形菜单中所有被勾选的元素: 4.树形菜单统一控制其下所有子元素按钮的事件分发: 5.可自动调节的滚动视野边缘,根据当前可见的子元素数量进行横向以及纵向的伸缩: 一.首先,我们先制作子元素的模板(Te