Skip to content

Instantly share code, notes, and snippets.

@rngtm
Last active November 17, 2018 13:53
Show Gist options
  • Save rngtm/7e04d0428497e30d8c583428c4ff780b to your computer and use it in GitHub Desktop.
Save rngtm/7e04d0428497e30d8c583428c4ff780b to your computer and use it in GitHub Desktop.
大量の立方体を生成するスクリプト。 1Meshなので軽いはず。
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class GenerateManyCube : MonoBehaviour
{
[SerializeField] bool m_GenerateMeshOnUpdate = false;
[Space]
[SerializeField] Vector3 m_CubeScale = new Vector3(1f, 1f, 1f); // 立方体の大きさ
[SerializeField] Vector3Int m_CubeNumbers = new Vector3Int(4, 2, 4); // 立方体の個数
[SerializeField] float m_CubeInterval = 1f; // 立方体の配置間隔
[SerializeField] Vector3 m_CubeIntervals = new Vector3(1f, 1f, 1f); // 立方体の配置間隔(xyz個別)
private Mesh m_Mesh;
private void Start()
{
m_Mesh = new Mesh();
var meshFilter = GetComponent<MeshFilter>();
meshFilter.mesh = m_Mesh;
GenerateCubeMesh();
}
private void Update()
{
// 毎フレームメッシュを更新
if (m_GenerateMeshOnUpdate)
{
GenerateCubeMesh();
}
}
/// <summary>
/// 立方体のメッシュ生成
/// </summary>
void GenerateCubeMesh()
{
if (m_CubeNumbers.x < 1) { m_CubeNumbers.x = 1; }
if (m_CubeNumbers.y < 1) { m_CubeNumbers.y = 1; }
if (m_CubeNumbers.z < 1) { m_CubeNumbers.z = 1; }
int totalCubeNumber = m_CubeNumbers.x * m_CubeNumbers.y * m_CubeNumbers.z;
// すべての立方体の頂点座標(vertices)の生成
Vector3[] vertices = new Vector3[8 * totalCubeNumber];
int vi = 0;
Vector3 vertexOffset = new Vector3(0, 0, 0);
for (int z = 0; z < m_CubeNumbers.z; z++)
{
vertexOffset.z = (z - m_CubeNumbers.z / 2f) * m_CubeInterval * m_CubeIntervals.z - m_CubeScale.z / 2f;
for (int y = 0; y < m_CubeNumbers.y; y++)
{
vertexOffset.y = (y - m_CubeNumbers.y / 2f) * m_CubeInterval * m_CubeIntervals.y - m_CubeScale.y / 2f;
for (int x = 0; x < m_CubeNumbers.x; x++)
{
vertexOffset.x = (x - m_CubeNumbers.x / 2f) * m_CubeInterval * m_CubeIntervals.x - m_CubeScale.x / 2f;
vertices[vi++] = Vector3.Scale(new Vector3(0, 0, 0), m_CubeScale) + vertexOffset; // 0
vertices[vi++] = Vector3.Scale(new Vector3(0, 1, 0), m_CubeScale) + vertexOffset; // 1
vertices[vi++] = Vector3.Scale(new Vector3(1, 1, 0), m_CubeScale) + vertexOffset; // 2
vertices[vi++] = Vector3.Scale(new Vector3(1, 0, 0), m_CubeScale) + vertexOffset; // 3
vertices[vi++] = Vector3.Scale(new Vector3(0, 0, 1), m_CubeScale) + vertexOffset; // 4
vertices[vi++] = Vector3.Scale(new Vector3(0, 1, 1), m_CubeScale) + vertexOffset; // 5
vertices[vi++] = Vector3.Scale(new Vector3(1, 1, 1), m_CubeScale) + vertexOffset; // 6
vertices[vi++] = Vector3.Scale(new Vector3(1, 0, 1), m_CubeScale) + vertexOffset; // 7
}
}
}
// すべての立方体の6面の頂点インデックス(triangles)を作成
int[] triangles = new int[6 * 6 * totalCubeNumber];
int ti = 0;
int triangleOffset = 0;
for (int i = 0; i < totalCubeNumber; i++)
{
// xy平面に平行な面
triangles[ti++] = 0 + triangleOffset;
triangles[ti++] = 1 + triangleOffset;
triangles[ti++] = 2 + triangleOffset;
triangles[ti++] = 0 + triangleOffset;
triangles[ti++] = 2 + triangleOffset;
triangles[ti++] = 3 + triangleOffset;
triangles[ti++] = 6 + triangleOffset;
triangles[ti++] = 5 + triangleOffset;
triangles[ti++] = 4 + triangleOffset;
triangles[ti++] = 7 + triangleOffset;
triangles[ti++] = 6 + triangleOffset;
triangles[ti++] = 4 + triangleOffset;
// yz平面に平行な面
triangles[ti++] = 4 + triangleOffset;
triangles[ti++] = 5 + triangleOffset;
triangles[ti++] = 1 + triangleOffset;
triangles[ti++] = 4 + triangleOffset;
triangles[ti++] = 1 + triangleOffset;
triangles[ti++] = 0 + triangleOffset;
triangles[ti++] = 2 + triangleOffset;
triangles[ti++] = 6 + triangleOffset;
triangles[ti++] = 7 + triangleOffset;
triangles[ti++] = 3 + triangleOffset;
triangles[ti++] = 2 + triangleOffset;
triangles[ti++] = 7 + triangleOffset;
// zx平面に平行な面
triangles[ti++] = 5 + triangleOffset;
triangles[ti++] = 6 + triangleOffset;
triangles[ti++] = 2 + triangleOffset;
triangles[ti++] = 5 + triangleOffset;
triangles[ti++] = 2 + triangleOffset;
triangles[ti++] = 1 + triangleOffset;
triangles[ti++] = 3 + triangleOffset;
triangles[ti++] = 7 + triangleOffset;
triangles[ti++] = 4 + triangleOffset;
triangles[ti++] = 4 + triangleOffset;
triangles[ti++] = 0 + triangleOffset;
triangles[ti++] = 3 + triangleOffset;
triangleOffset += 8;
}
// メッシュ更新
m_Mesh.vertices = vertices;
m_Mesh.triangles = triangles;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment