• トップ
  • ブログ一覧
  • 【Unity】スクリプトからメッシュを作ってみる!
  • 【Unity】スクリプトからメッシュを作ってみる!

    広告メディア事業部広告メディア事業部
    2021.09.13

    エンジニアになろう!

    メッシュをスクリプトから生成してみよう!

    3D ゲームの核となる要素「メッシュ」。

    Unity でゲームを作るなら、これを理解しなければ始まりません。

    そこで、今回は、シンプルなメッシュをスクリプトから作ってみたいと思います!

    Unity Engine の Mesh クラスを使えば、メッシュの生成から応用まで簡単にできますよ。

    メッシュの基礎知識

    メッシュとは

    一般的に「メッシュ」とは、三角形のポリゴンの集合体(=オブジェクト)をいいます。

    このメッシュには、以下のような情報が含まれています。

    1. Vertex(頂点の位置)
    2. Normal(法線。各頂点に対する面の向き)
    3. Tangent(接線。各頂点に対する Normal と直交する)
    4. UV1~UV4(テクスチャ座標。1つの頂点につき最大4個まで)
    5. Color(頂点の色)
    6. Index(頂点のインデックス。ポリゴンを定義するのに使う)

    Mesh クラス

    Unity において、上記のようなメッシュ情報を管理するのが Mesh クラスです。

    ここでは、メッシュを生成する上で最低限の変数と関数のみご紹介します。

    vertices

    メッシュに含まれる頂点の位置情報を収納した配列です。

    中身は Vector3 の配列になっていて、Mesh.SetVertices() で新しい頂点の配列を割り当てます。

    引数には、新しい頂点の位置を収納した配列を渡します。

    triangles

    メッシュに含まれる全ての三角形の配列です。

    中身は整数で、頂点配列のインデックスになっています。

    triangles

    Mesh.SetTriangles() で新しい三角形の配列を割り当て、引数には新しい三角形の配列を渡します。

    メッシュを生成する

    それではさっそく、メッシュ生成に取り掛かりましょう!

    オブジェクトを作成

    まずは、Hierarchy 内に Empty Object を作成してください。

    そして、作成したメッシュを可視化する「MeshFilter コンポーネント」と「MeshRender コンポーネント」を追加します。

    オブジェクトを作成

    スクリプトの作成

    今回は、Quad を作成します。

    Quad は「4つの頂点を持ち、2つの三角形から構成されている」のがポイントです。

    頂点の配列

    まず、頂点の配列を作ってメッシュに割り当てていきますが、その際、以下の順番で割り当てます。

    頂点の配列
    1Vector3[] myVertices = new Vector3[4];
    2
    3myVertices[0] = new Vector3(0, 0, 0);
    4myVertices[1] = new Vector3(width, 0, 0);
    5myVertices[2] = new Vector3(0, hight, 0);
    6myVertices[3] = new Vector3(width, hight, 0);
    7
    8myMesh.SetVertices(myVertices);

    三角形の配列

    Quad を構成する2つの三角形は、それぞれ3つの頂点で定義されています。

    頂点配列のインデックスで指定しますが、時計回りに並べることを忘れないでください。

    1int[] myTriangles = new int[6];
    2
    3myTriangles[0] = 0;
    4myTriangles[1] = 2;
    5myTriangles[2] = 1;
    6myTriangles[3] = 2;
    7myTriangles[4] = 3;
    8myTriangles[5] = 1;
    9
    10myMesh.SetTriangles(myTriangles,0);

    メッシュをアタッチする

    あとは、メッシュを MeshFilter の mesh に割り当て、最初に作成したゲームオブジェクトにアタッチするだけです。

    以下が、スクリプト全体のサンプルコードです。

    1using UnityEngine;
    2
    3public class MeshManager : MonoBehaviour
    4{
    5    private MeshFilter meshFilter;
    6    private Mesh myMesh;
    7    private Vector3[] myVertices = new Vector3[4];
    8    private int[] myTriangles = new int[6];
    9    private float width = 2;
    10    private float hight = 2;
    11
    12    void Start()
    13    {
    14        meshFilter = gameObject.GetComponent<MeshFilter>();
    15        myMesh = new Mesh();
    16
    17        myVertices[0] = new Vector3(0, 0, 0);
    18        myVertices[1] = new Vector3(width, 0, 0);
    19        myVertices[2] = new Vector3(0, hight, 0);
    20        myVertices[3] = new Vector3(width, hight, 0);
    21
    22        myMesh.SetVertices(myVertices);
    23
    24        myTriangles[0] = 0;
    25        myTriangles[1] = 2;
    26        myTriangles[2] = 1;
    27        myTriangles[3] = 2;
    28        myTriangles[4] = 3;
    29        myTriangles[5] = 1;
    30
    31        myMesh.SetTriangles(myTriangles, 0);
    32
    33        //MeshFilterへの割り当て
    34        meshFilter.mesh = myMesh;
    35    }
    36}

    問題なく作成できていれば、以下のように Quad が表示されるはずです。

    問題なく作成できていれば、以下のように Quad が表示される

    ここでは、テクスチャー等を使用していないためピンクのままですが 、MeshRender 内の Material を変更すれば好みの色に変更できます。

    メッシュを変形させてみよう

    最後に、応用編として、メッシュを少しだけ変形させてみましょう。

    スペースキーを押している間、メッシュが変形するようにします。

    以下のコードを、上記スクリプトに付け加えてみてください。

    1void Update()
    2    {
    3        if (Input.GetKey(KeyCode.Space)) //スペースキーの入力
    4        {
    5            for(int i = 0; i < myVertices.Length; i++)
    6            {
    7                //頂点をずらす
    8                myVertices[i] += new Vector3(Random.Range(-0.05f, 0.05f), Random.Range(-0.05f, 0.05f));
    9            }
    10            myMesh.SetVertices(myVertices); //新しい頂点を割り当てる
    11
    12        }
    13        
    14    }

    再生中にスペースを押すと、Quad が変形するはずです!

    さいごに

    今回は、スクリプトからメッシュを作ってみました

    今回はごくごくシンプルな仕様なので最低限のことしかしていませんが、冒頭で紹介したようなメッシュの要素をいじっていくと、さらに自由度や正確性が上がりますよ。

    メッシュは奥深いので、ぜひ一度挑戦してみてくださいね!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background