simple-code
unity cone 콘(원뿔), cylinder 실린더(원기둥) 만들기
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GenerateCone : MonoBehaviour
{
public int numOfSides = 20;
public float radius = 1f;
public float height = 2f;
public Material coneMaterial; // Inspector에서 material을 할당받기 위한 변수
void Start()
{
// Get the MeshFilter component and create a new Mesh
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
int vertexCount = numOfSides + 2;
int triangleCount = numOfSides * 3 + numOfSides * 3; // 측면과 밑면 삼각형
Vector3[] vertices = new Vector3[vertexCount];
Vector3[] normals = new Vector3[vertexCount];
int[] triangles = new int[triangleCount];
// Vertex at the tip of the cone
vertices[0] = Vector3.up * height;
// Vertices around the base and the center of the base
vertices[vertexCount - 1] = Vector3.zero; // 밑면의 중앙
float angleStep = 360.0f / numOfSides;
for (int i = 0; i < numOfSides; i++)
{
float angle = Mathf.Deg2Rad * angleStep * i;
vertices[i + 1] = new Vector3(Mathf.Cos(angle) * radius, 0, Mathf.Sin(angle) * radius);
}
// Creating triangles for the sides
for (int i = 0; i < numOfSides; i++)
{
triangles[i * 3] = 0;
triangles[i * 3 + 1] = i + 1;
triangles[i * 3 + 2] = (i + 2 > numOfSides) ? 1 : i + 2;
}
// Creating triangles for the base
int baseIndex = numOfSides * 3; // 측면 삼각형 이후의 인덱스 시작점
for (int i = 0; i < numOfSides; i++)
{
triangles[baseIndex + i * 3] = vertexCount - 1; // 밑면의 중앙
triangles[baseIndex + i * 3 + 1] = (i + 2 > numOfSides) ? 1 : i + 2;
triangles[baseIndex + i * 3 + 2] = i + 1;
}
// Assign vertices and triangles to the mesh
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
// Get the MeshRenderer component and apply the material
MeshRenderer renderer = GetComponent<MeshRenderer>();
renderer.material = coneMaterial; // 전달받은 material을 적용
}
}
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GenerateCylinder : MonoBehaviour
{
public int numOfSides = 20;
public float topRadius = 0.5f;
public float bottomRadius = 1f;
public float height = 2f;
public Material cylinderMaterial;
void Start()
{
MeshFilter mf = GetComponent<MeshFilter>();
Mesh mesh = new Mesh();
mf.mesh = mesh;
// 총 vertex의 수: 윗면, 아랫면에 각각 numOfSides개의 vertex와 중앙점 2개
int vertexCount = numOfSides * 2 + 2;
// 측면 삼각형: numOfSides * 2 (두 개의 삼각형으로 이루어짐)
// 윗면, 아랫면: 각각 numOfSides개의 삼각형
int triangleCount = numOfSides * 2 * 3 + numOfSides * 3 + numOfSides * 3;
Vector3[] vertices = new Vector3[vertexCount];
int[] triangles = new int[triangleCount];
// 윗면과 아랫면 중앙점
vertices[vertexCount - 2] = new Vector3(0, height, 0); // Top center
vertices[vertexCount - 1] = Vector3.zero; // Bottom center
float angleStep = 360.0f / numOfSides;
for (int i = 0; i < numOfSides; i++)
{
float angle = Mathf.Deg2Rad * angleStep * i;
float x = Mathf.Cos(angle);
float z = Mathf.Sin(angle);
// 윗면 vertex
vertices[i] = new Vector3(x * topRadius, height, z * topRadius);
// 아랫면 vertex
vertices[i + numOfSides] = new Vector3(x * bottomRadius, 0, z * bottomRadius);
}
// 측면 삼각형 생성
for (int i = 0; i < numOfSides; i++)
{
int next = (i + 1) % numOfSides;
int current = i;
// 첫 번째 삼각형
triangles[i * 6] = current;
triangles[i * 6 + 1] = next;
triangles[i * 6 + 2] = current + numOfSides;
// 두 번째 삼각형
triangles[i * 6 + 3] = next;
triangles[i * 6 + 4] = next + numOfSides;
triangles[i * 6 + 5] = current + numOfSides;
}
// 윗면 삼각형 생성 (반시계 방향)
int topIndexStart = numOfSides * 6; // 다음 삼각형 배열 시작점
for (int i = 0; i < numOfSides; i++)
{
int next = (i + 1) % numOfSides;
triangles[topIndexStart + i * 3] = i;
triangles[topIndexStart + i * 3 + 1] = numOfSides * 2;
triangles[topIndexStart + i * 3 + 2] = next;
}
// 아랫면 삼각형 생성 (시계 방향)
int bottomIndexStart = topIndexStart + numOfSides * 3;
for (int i = 0; i < numOfSides; i++)
{
int next = (i + 1) % numOfSides;
triangles[bottomIndexStart + i * 3] = i + numOfSides;
triangles[bottomIndexStart + i * 3 + 1] = next + numOfSides;
triangles[bottomIndexStart + i * 3 + 2] = vertexCount - 1;
}
// 매쉬에 할당
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
// 메터리얼 할당
MeshRenderer renderer = GetComponent<MeshRenderer>();
renderer.material = cylinderMaterial;
}
}