[Unity] スクリプトからメッシュ(ポリゴン)を生成する

描画するメッシュをスクリプトから動的に生成する方法のメモ書きです。
これを行うことで、スクリプトから好きな図形のメッシュを作成できるようになります。

まず、以下の手順を踏んでメッシュを描画するための準備を行います。

1.ゲームオブジェクトを生成する
2.Mesh Filterを1.で作成したゲームオブジェクトにアタッチする
3.Mesh Rendererを1.で作成したゲームオブジェクトにアタッチする

以上ができたら本題のスクリプト作成に入ります。

メッシュ情報はMeshクラスで管理されます。
Meshのインスタンス化はnewで行います。

Mesh mesh = new Mesh();

作成したら、Meshインスタンスに以下情報を指定する必要があります。

 ・頂点
 ・頂点のUV座標
 ・頂点インデックス

これらはDirectXやOpenGLでも登場します。
描画の詳しい仕組みはあえてここでは説明しません。

今回は長方形のポリゴンをRectを元に作成してみます。

	// 頂点の指定
	mesh.vertices = new Vector3[] {
		new Vector3(rect.xMin, rect.yMin, 0),
		new Vector3(rect.xMax, rect.yMin, 0),
		new Vector3(rect.xMax, rect.yMax, 0),
		new Vector3(rect.xMin, rect.yMax, 0),
	};
	// UV座標の指定
	mesh.uv = new Vector2[] {
		new Vector2(0, 0),
		new Vector2(1, 0),
		new Vector2(1, 1),
		new Vector2(0, 1),
	};
	// 頂点インデックスの指定
	mesh.triangles = new int[] {
		0, 1, 2,
		0, 2, 3,
	};

頂点はその名のとおりメッシュの頂点を構成するための座標です。
長方形では4つ頂点が必要になるので、4つの頂点座標をVector3で指定しています。
頂点は反時計回りとします。

UV座標はテクスチャを張るとき、画像のどこが頂点に来るかを示す情報です。
画像の左下が(0, 0)、右上が(1, 1)となります。

頂点インデックスはいわゆるポリゴンを構成する情報です。
3点で1つの三角形ポリゴンとなります。
今回は反時計回りのポリゴンを(0, 1, 2)、(0, 2, 3)2つ定義して長方形を作成しています。

必要な情報をすべて指定したら、以下処理で法線およびバウンディングボックスを再計算します。

	mesh.RecalculateNormals();
	mesh.RecalculateBounds();

最後に、MeshインスタンスをMeshFilterに指定して完了です。

	filter.sharedMesh = mesh;

上記をまとめたスクリプトを以下に記しておきます。

	Mesh mesh = new Mesh();

	// 頂点の指定
	mesh.vertices = new Vector3[] {
		new Vector3(rect.xMin, rect.yMin, 0),
		new Vector3(rect.xMax, rect.yMin, 0),
		new Vector3(rect.xMax, rect.yMax, 0),
		new Vector3(rect.xMin, rect.yMax, 0),
	};
	// UV座標の指定
	mesh.uv = new Vector2[] {
		new Vector2(0, 0),
		new Vector2(1, 0),
		new Vector2(1, 1),
		new Vector2(0, 1),
	};
	// 頂点インデックスの指定
	mesh.triangles = new int[] {
		0, 1, 2,
		0, 2, 3,
	};

	mesh.RecalculateNormals();
	mesh.RecalculateBounds();

	filter.sharedMesh = mesh;

デフォルトで用意されているメッシュが足りないと思ったらスクリプトで作るのも手だと思います。

■参考サイト
ポリゴンメッシュの作成