本日はUnity実験枠です。
普段はBlenderなどでメッシュを作成しShaderを使用することで描画を行っていますが、このメッシュを今回はC#で作成していきます。
〇六角形のメッシュの作成
昨日は3つの頂点から構成される基本的なポリゴンを作成しました。
本日は昨日より複雑なメッシュを作成していきます。
エフェクトなどを想定しているので、六角形のポリゴンを作成します。
①頂点の座標を知るためにBlenderで円メッシュを作成し、頂点数を6に指定します。
②各頂点の座標を控えます。
③原点を含む各頂点の座標をVector3型でVector3の配列に定義します。
Vector3[] vertex= new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1f, 0), new Vector3(0.866025f, 0.5f, 0), new Vector3(0.866025f, -0.5f, 0), new Vector3(0, -1f, 0), new Vector3(-0.866025f, -0.5f, 0), new Vector3(-0.866025f, 0.5f, 0), };
今回は各頂点を次のように順番に定義しました
次にインデックスですが、今回は原点の頂点から順に次のようにポリゴンを作成します。
int[] trianglesIndex = new int[] { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 1, };
かく改行毎にポリゴンが定義されています。
これによって六角形のポリゴンが作られるようになりました。
ワイヤフレーム表示で見ると正しくポリゴンが張られていることがわかります。
〇スクリプト
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class CreateHex : MonoBehaviour { private MeshFilter _meshFilter; private MeshRenderer _meshRenderer; private Mesh output; [SerializeField] private int _hexSize; [SerializeField] private Material _material; // 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(); output.RecalculateBounds(); output.RecalculateNormals(); //set Mesh _meshFilter.sharedMesh = output; _meshRenderer.material = _material; } void CreateMesh() { Vector3[] vertex= new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 1f, 0), new Vector3(0.866025f, 0.5f, 0), new Vector3(0.866025f, -0.5f, 0), new Vector3(0, -1f, 0), new Vector3(-0.866025f, -0.5f, 0), new Vector3(-0.866025f, 0.5f, 0), }; for (int i = 1; i < _hexSize; i++) { #region Hex1 float addposx1 = (i*0.866025f); float addposy1 = (i*1.5f); Vector3[] vertex2 = new Vector3[] { new Vector3(0+addposx1, 0+addposy1, 0), new Vector3(0+addposx1, 1f+addposy1, 0), new Vector3(0.866025f+addposx1, 0.5f+addposy1, 0), new Vector3(0.866025f+addposx1, -0.5f+addposy1, 0), new Vector3(0+addposx1, -1f+addposy1, 0), new Vector3(-0.866025f+addposx1, -0.5f+addposy1, 0), new Vector3(-0.866025f+addposx1, 0.5f+addposy1, 0), }; int hexVertexLength= vertex.Length; Array.Resize(ref vertex, vertex.Length + vertex2.Length); Array.Copy(vertex2, 0, vertex, hexVertexLength, vertex2.Length); #endregion #region Hex2 float addposx3 = (i*-0.866025f); float addposy3 = (i*-1.5f); Vector3[] vertex3 = new Vector3[] { new Vector3(0+addposx3, 0+addposy3, 0), new Vector3(0+addposx3, 1f+addposy3, 0), new Vector3(0.866025f+addposx3, 0.5f+addposy3, 0), new Vector3(0.866025f+addposx3, -0.5f+addposy3, 0), new Vector3(0+addposx3, -1f+addposy3, 0), new Vector3(-0.866025f+addposx3, -0.5f+addposy3, 0), new Vector3(-0.866025f+addposx3, 0.5f+addposy3, 0), }; hexVertexLength= vertex.Length; Array.Resize(ref vertex, vertex.Length + vertex3.Length); Array.Copy(vertex3, 0, vertex, hexVertexLength, vertex3.Length); #endregion #region Hex3 float addposx4 = (i*-0.866025f); float addposy4 = (i*1.5f); Vector3[] vertex4 = new Vector3[] { new Vector3(0+addposx4, 0+addposy4, 0), new Vector3(0+addposx4, 1f+addposy4, 0), new Vector3(0.866025f+addposx4, 0.5f+addposy4, 0), new Vector3(0.866025f+addposx4, -0.5f+addposy4, 0), new Vector3(0+addposx4, -1f+addposy4, 0), new Vector3(-0.866025f+addposx4, -0.5f+addposy4, 0), new Vector3(-0.866025f+addposx4, 0.5f+addposy4, 0), }; hexVertexLength= vertex.Length; Array.Resize(ref vertex, vertex.Length + vertex4.Length); Array.Copy(vertex4, 0, vertex, hexVertexLength, vertex4.Length); #endregion #region Hex4 float addposx5 = (i*0.866025f); float addposy5 = (i*-1.5f); Vector3[] vertex5 = new Vector3[] { new Vector3(0+addposx5, 0+addposy5, 0), new Vector3(0+addposx5, 1f+addposy5, 0), new Vector3(0.866025f+addposx5, 0.5f+addposy5, 0), new Vector3(0.866025f+addposx5, -0.5f+addposy5, 0), new Vector3(0+addposx5, -1f+addposy5, 0), new Vector3(-0.866025f+addposx5, -0.5f+addposy5, 0), new Vector3(-0.866025f+addposx5, 0.5f+addposy5, 0), }; hexVertexLength= vertex.Length; Array.Resize(ref vertex, vertex.Length + vertex5.Length); Array.Copy(vertex5, 0, vertex, hexVertexLength, vertex5.Length); #endregion #region Hex5 float addposx6 = (i*0.866025f*2); float addposy6 = (0); Vector3[] vertex6 = new Vector3[] { new Vector3(0+addposx6, 0+addposy6, 0), new Vector3(0+addposx6, 1f+addposy6, 0), new Vector3(0.866025f+addposx6, 0.5f+addposy6, 0), new Vector3(0.866025f+addposx6, -0.5f+addposy6, 0), new Vector3(0+addposx6, -1f+addposy6, 0), new Vector3(-0.866025f+addposx6, -0.5f+addposy6, 0), new Vector3(-0.866025f+addposx6, 0.5f+addposy6, 0), }; hexVertexLength= vertex.Length; Array.Resize(ref vertex, vertex.Length + vertex6.Length); Array.Copy(vertex6, 0, vertex, hexVertexLength, vertex6.Length); #endregion #region Hex6 float addposx7 = (i*0.866025f*-2); float addposy7 = (0); Vector3[] vertex7 = new Vector3[] { new Vector3(0+addposx7, 0+addposy7, 0), new Vector3(0+addposx7, 1f+addposy7, 0), new Vector3(0.866025f+addposx7, 0.5f+addposy7, 0), new Vector3(0.866025f+addposx7, -0.5f+addposy7, 0), new Vector3(0+addposx7, -1f+addposy7, 0), new Vector3(-0.866025f+addposx7, -0.5f+addposy7, 0), new Vector3(-0.866025f+addposx7, 0.5f+addposy7, 0), }; hexVertexLength= vertex.Length; Array.Resize(ref vertex, vertex.Length + vertex7.Length); Array.Copy(vertex7, 0, vertex, hexVertexLength, vertex7.Length); #endregion } int[] trianglesIndex = new int[] { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 6, 0, 6, 1, }; for (int i = 1; i < _hexSize; i++) { #region Hex1 int x = i *7; int[] trianglesIndex2 = new int[] { 0+x, 1+x, 2+x, 0+x, 2+x, 3+x, 0+x, 3+x, 4+x, 0+x, 4+x, 5+x, 0+x, 5+x, 6+x, 0+x, 6+x, 1+x, }; int hexIndexLength = trianglesIndex.Length; Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex2.Length); Array.Copy(trianglesIndex2,0,trianglesIndex,hexIndexLength,trianglesIndex2.Length); #endregion #region Hex2 int x2 = i*2 *7; int[] trianglesIndex3 = new int[] { 0+x2, 1+x2, 2+x2, 0+x2, 2+x2, 3+x2, 0+x2, 3+x2, 4+x2, 0+x2, 4+x2, 5+x2, 0+x2, 5+x2, 6+x2, 0+x2, 6+x2, 1+x2, }; hexIndexLength = trianglesIndex.Length; Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex3.Length); Array.Copy(trianglesIndex3,0,trianglesIndex,hexIndexLength,trianglesIndex3.Length); #endregion #region Hex3 int x3 = i*3 *7; int[] trianglesIndex4 = new int[] { 0+x3, 1+x3, 2+x3, 0+x3, 2+x3, 3+x3, 0+x3, 3+x3, 4+x3, 0+x3, 4+x3, 5+x3, 0+x3, 5+x3, 6+x3, 0+x3, 6+x3, 1+x3, }; hexIndexLength = trianglesIndex.Length; Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex4.Length); Array.Copy(trianglesIndex4,0,trianglesIndex,hexIndexLength,trianglesIndex4.Length); #endregion #region Hex4 int x4 = i*4 *7; int[] trianglesIndex5 = new int[] { 0+x4, 1+x4, 2+x4, 0+x4, 2+x4, 3+x4, 0+x4, 3+x4, 4+x4, 0+x4, 4+x4, 5+x4, 0+x4, 5+x4, 6+x4, 0+x4, 6+x4, 1+x4, }; hexIndexLength = trianglesIndex.Length; Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex5.Length); Array.Copy(trianglesIndex5,0,trianglesIndex,hexIndexLength,trianglesIndex5.Length); #endregion #region Hex5 int x5 = i*5 *7; int[] trianglesIndex6 = new int[] { 0+x5, 1+x5, 2+x5, 0+x5, 2+x5, 3+x5, 0+x5, 3+x5, 4+x5, 0+x5, 4+x5, 5+x5, 0+x5, 5+x5, 6+x5, 0+x5, 6+x5, 1+x5, }; hexIndexLength = trianglesIndex.Length; Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex6.Length); Array.Copy(trianglesIndex6,0,trianglesIndex,hexIndexLength,trianglesIndex6.Length); #endregion #region Hex6 int x6 = i*6 *7; int[] trianglesIndex7 = new int[] { 0+x6, 1+x6, 2+x6, 0+x6, 2+x6, 3+x6, 0+x6, 3+x6, 4+x6, 0+x6, 4+x6, 5+x6, 0+x6, 5+x6, 6+x6, 0+x6, 6+x6, 1+x6, }; hexIndexLength = trianglesIndex.Length; Array.Resize(ref trianglesIndex,trianglesIndex.Length + trianglesIndex7.Length); Array.Copy(trianglesIndex7,0,trianglesIndex,hexIndexLength,trianglesIndex7.Length); #endregion } Debug.Log(vertex[6]); Debug.Log(vertex.Length); Debug.Log(trianglesIndex.Length); output.SetVertices(vertex); //set vertex; output.SetTriangles(trianglesIndex,0); } }