1. 程式人生 > >Unity中建立自己的mesh以及動態修改mesh

Unity中建立自己的mesh以及動態修改mesh

開頭

最近發現有很多人不知道在unity中可以建立和修改mesh,以為mesh只能從3dmax等軟體中匯入,所以這篇就相當於科普了。

正文

首先介紹如何建立mesh。

這裡寫圖片描述 
先建立一個空物體,名為test。 
 
然後為這個物體增加 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,如下圖: 
這裡寫圖片描述

下面是執行後的圖片: 
這裡寫圖片描述

至於為什麼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) }; 那就會變成下面這個樣子: 
這裡寫圖片描述

有一點要注意的是,頂點陣列中的頂點座標都是在模型座標系中的,就是以剛開始建立的Test空物體的座標為原點。

以上只是簡單建立了一個平面mesh,至於如何建立3d mesh和修改mesh,相信聰明的你一定會啦。

最後