Last active
November 17, 2018 13:53
-
-
Save rngtm/7e04d0428497e30d8c583428c4ff780b to your computer and use it in GitHub Desktop.
大量の立方体を生成するスクリプト。 1Meshなので軽いはず。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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