本日はUnity実験枠です。
普段はBlenderなどでメッシュを作成しShaderを使用することで描画を行っていますが、このメッシュを今回はC#で作成していきます。
〇Meshクラス
スクリプトでメッシュを作成するためにはMeshクラスを使用します。
Meshクラスはメッシュジオメトリに関する基本的なクラスです。
output = new Mesh();
スクリプトでメッシュを作成するためには3つの頂点とメッシュのインデックスが必要です。
この3つの頂点というのは基本的なポリゴンを形成するために必要な最低数の頂点になります。
この頂点を定義するためにはMesh.SetVertices()を使用します。
output.SetVertices( new Vector3[]{ new Vector3 (0, 1f, 0), new Vector3 (1f, -1f, 0), new Vector3 (-1f, -1f, 0), } );
メッシュインデックスとは3の倍数の整数で指定されるもので,メッシュには表と裏があります。
インデックスに基づきこれらが決まっているようです。
最後にUnityで作成したメッシュを描画するためにMeshfilterコンポーネントのMeshFilter.sharedMeshに代入します。
_meshFilter.sharedMesh = output;
また描画を行うためにMeshRendererをアタッチしている必要があります。
これを実行すると次のようにメッシュが作成されました。
メッシュがピンク色になっているのはマテリアルが存在しないためです。
MeshRendererのマテリアルに任意のマテリアルをアタッチすることで正常に描画されるようになります。
[SerializeField] private Material _material; _meshRenderer.material = _material;
本日は以上です。
今回は単一のメッシュを作成しましたが、Shaderと合わせて表現できるようにしていきたいです。
スクリプトでメッシュを作るのが良いのか、ジオメトリシェーダーで作るのが良いのかそのうち試してみたいです。
〇スクリプト
using UnityEngine; public class CreateHex : MonoBehaviour { private MeshFilter _meshFilter; private MeshRenderer _meshRenderer; private Mesh output; // Start is called before the first frame update void Start() { if (_meshFilter == null) _meshFilter = this.GetComponent<MeshFilter>(); if (_meshRenderer == null) _meshRenderer = this.GetComponent<MeshRenderer>(); output = new Mesh(); CreateMesh(); } void CreateMesh() { output.SetVertices( new Vector3[]{ new Vector3 (0, 1f, 0), new Vector3 (1f, -1f, 0), new Vector3 (-1f, -1f, 0), } ); //set vertex; output.SetTriangles( new int[] { 0, 1, 2 }, 0 ); //set Mesh _meshFilter.sharedMesh = output; _meshRenderer.material = _material; } }
〇参考