本日は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);
}
}