开头

最近发现有很多人不知道在unity中可以创建和修改mesh,以为mesh只能从3dmax等软件中导入,所以这篇就相当于科普了。

正文

首先介绍如何创建mesh。


unity 动态创建mesh 面 unity 生成mesh_3d

 

先创建一个空物体,名为test。 

unity 动态创建mesh 面 unity 生成mesh_数组_02

 

然后为这个物体增加 meshrender 和 meshfilter 两个组件

下面就要写将要赋给它的脚本了,先贴上代码,解释在下面。
using UnityEngine;
using System.Collections;

public class Test: MonoBehaviour
{

    void Start()
    {
        Vector3[] newVertices = { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0) };
        Vector2[] newUV = { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) };
        int[] newTriangles = {0,2,1,0,3,2};

        Mesh mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        mesh.vertices = newVertices;
        mesh.uv = newUV;
        mesh.triangles = newTriangles;


    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

要创建一个mesh必须要准备好三个数组分别是顶点数组,三角形数组,uv数组。

也可以用下面的代码赋值

int[] p = new int[10];
            for (int i = 0; i <= 9; i++)
            {
                Console.Write("请输入第{0}个值:",i+1);
                p[i] = int.Parse(Console.ReadLine());
            }



  • 顶点数组 包括这个mesh中所有的顶点,如 Vector3[] newVertices = { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0) }; 其中有四个顶点,分别为正方形四个角。
  • 三角形数组 指定如何构成每个三角形,同时也确定了三角形的个数,如 int[] newTriangles = {0,2,1,0,3,2}; 这行代码表示0,2,1(对应着newVertices[0],newVertices [2],newVertices [1]),构成第一个三角形的三个角,数字的顺序表示顺逆时针,同时确定了三角形的正反面,后面的0,3,2同理,这就代表此mesh有两个三角形。
  • uv数组 这是一个vector2数组,用来确定顶点数组中每个顶点的uv坐标,这在下面将演示给大家看。

代码写好之后,把脚本贴到Test物体上,然后设置一个material,如下图: 

unity 动态创建mesh 面 unity 生成mesh_数组_03

下面是运行后的图片: 

unity 动态创建mesh 面 unity 生成mesh_3d_04

至于为什么uv数组是什么,你可以认为这张图片的四个角的uv坐标分别为(0,0),(1,0),(1,1),(1,0),如果我把上面代码中的uv数组改成 Vector2[] newUV = { new Vector2(0, 0), new Vector2(0, 1), new Vector2(0.5f, 1), new Vector2(0.5f, 0) }; 那就会变成下面这个样子: 

unity 动态创建mesh 面 unity 生成mesh_数组_05

有一点要注意的是,顶点数组中的顶点坐标都是在模型坐标系中的,就是以刚开始创建的Test空物体的坐标为原点。

以上只是简单创建了一个平面mesh,至于如何创建3d mesh和修改mesh,相信聪明的你一定会啦。

最后