!!!ポリゴンメッシュの作成 スクリプトでポリゴンメッシュを作成するには、Meshクラスを使用します。 まずemptyなカラのGameObjectを作成しておき、ここに「Mesh Filter」と「Mesh Renderer」をコンポーネントとして登録しておきます。 {{ref_image unity_create_mesh_01.png}} スクリプト「CreatePolygonMesh.cs」というのを新規で作り、コンポーネントとして指定のGameObjectに追加しておきます。 GameObjectのコンポーネントとしては、 *Mesh Filter *Mesh Renderer *CreatePolygonMesh (script) の3つが追加されている状態になります。 Mesh Filterは、ポリゴンメッシュのジオメトリを受け取るものです。中身についてはスクリプトで記載します。 Mesh Rendererは、レンダリングを一手に引き受けるものです。マテリアルもここで指定できます。 !!スクリプトの記述 using UnityEngine; using System.Collections; public class CreatePolygonMesh : MonoBehaviour { private Mesh mesh; // Use this for initialization void Start () { mesh = new Mesh(); Vector3 [] newVertices = new Vector3[4]; Vector2 [] newUV = new Vector2[4]; int[] newTriangles = new int[2 * 3]; // 頂点座標の指定. newVertices[0] = new Vector3(-2.0f, 0.0f, 2.0f); newVertices[1] = new Vector3(-2.0f, 0.0f, -2.0f); newVertices[2] = new Vector3( 2.0f, 0.0f, -2.0f); newVertices[3] = new Vector3( 2.0f, 0.0f, 2.0f); // UVの指定 (頂点数と同じ数を指定すること). newUV[0] = new Vector2(0.0f, 0.0f); newUV[1] = new Vector2(0.0f, 1.0f); newUV[2] = new Vector2(1.0f, 1.0f); newUV[3] = new Vector2(1.0f, 0.0f); // 三角形ごとの頂点インデックスを指定. newTriangles[0] = 2; newTriangles[1] = 1; newTriangles[2] = 0; newTriangles[3] = 0; newTriangles[4] = 3; newTriangles[5] = 2; mesh.vertices = newVertices; mesh.uv = newUV; mesh.triangles = newTriangles; mesh.RecalculateNormals(); mesh.RecalculateTangents(); mesh.RecalculateBounds(); GetComponent().sharedMesh = mesh; GetComponent().sharedMesh.name = "myMesh"; } // Update is called once per frame void Update () { } } 個々の頂点座標/UV/三角形のインデックスを配列に格納します。 UVについては頂点数と同じ数になるようにします。 三角形のインデックスは3頂点ごとに指定していきます。 「mesh = new Mesh();」でメッシュを生成し、 mesh.vertices = newVertices; mesh.uv = newUV; mesh.triangles = newTriangles; として、頂点/UV/三角形のインデックスの配列を渡します。 mesh.RecalculateNormals(); mesh.RecalculateTangents(); mesh.RecalculateBounds(); として、法線/法線マップ用のTangentSpaceとバウンディングボックスを再計算。 法線については、「mesh.normals」にVector3型の配列を直接渡してもよいです。 なお、「mesh.RecalculateTangents();」の指定がないと法線マップのマッピングは正しく行われません。 GetComponent().sharedMesh = mesh; GetComponent().sharedMesh.name = "myMesh"; でGameObjectのMesh Filterとしてのジオメトリと名前を渡します。 これで実行すると、シーン上にスクリプトで作成されたポリゴンメッシュが表示されます。 {{ref_image unity_create_mesh_02.png}} !!動的にポリゴンメッシュを再構成する Update関数内で、 Mesh mesh = GetComponent().mesh; Vector3[] vertices = mesh.vertices; for (int i = 0; i < vertices.Length; i++) { vertices[i].x += 0.01f; } mesh.vertices = vertices; のように頂点座標を変更したり、「mesh.Clear()」としてジオメトリ情報をクリアして再度頂点/UV/三角形のインデックスを格納することにより、動的にポリゴンメッシュを作り直すことができます。 !!速度面での注意点 for (int i = 0; i < mesh.vertices.Length; i++) { Vector3 v = mesh.vertices[i]; } のような実装は速度的にかなり遅い。 Vector3[] vertices = mesh.vertices; int verCou = vertices.Length; for (int i = 0; i < verCou ; i++) { Vector3 v = vertices[i]; } のように、いったん配列に入れてから使用するほうがはるかに速くなる。 ---- {{lastmodified}}