simple-code
unity inside cube
using UnityEngine;
public class CubeInside : MonoBehaviour
{
public Material cube_mat; // 사용자 정의 머티리얼을 할당받기 위한 변수
void Start()
{
MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
Mesh mesh = new Mesh();
mesh.name = "InwardCube";
Vector3[] vertices = {
new Vector3(0.5f, 0.5f, 0.5f),
new Vector3(-0.5f, 0.5f, 0.5f),
new Vector3(-0.5f, -0.5f, 0.5f),
new Vector3(0.5f, -0.5f, 0.5f),
new Vector3(0.5f, 0.5f, -0.5f),
new Vector3(-0.5f, 0.5f, -0.5f),
new Vector3(-0.5f, -0.5f, -0.5f),
new Vector3(0.5f, -0.5f, -0.5f),
};
int[] triangles = {
0, 2, 1, 0, 3, 2, // Front
4, 5, 6, 4, 6, 7, // Back
0, 1, 5, 0, 5, 4, // Top
2, 3, 7, 2, 7, 6, // Bottom
0, 4, 7, 0, 7, 3, // Right
1, 2, 6, 1, 6, 5 // Left
};
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
meshFilter.mesh = mesh;
// Cube Material이 유효한지 확인한 후 메터리얼 할당
if (cube_mat != null)
{
meshRenderer.material = cube_mat;
}
else
{
Debug.LogWarning("Material이 할당되지 않았습니다.");
}
}
}
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GenerateCylinder : MonoBehaviour
{
public int numOfSides = 20;
public float topRadius_start = 0.5f;
public float bottomRadius_start = 1f;
public float height_start = 2f;
public float topRadius_end = 0.5f;
public float bottomRadius_end = 1f;
public float height_end = 2f;
public float topRadius = 0.5f; //current top radius
public float bottomRadius = 1f; //current bottom radius
public float height = 2f; //current height
[Range(0, 1)]
public float LerpValue = 0.5f;
public Material cylinderMaterial;
void Awake(){
DrawMesh();
}
void Update()
{
//DrawMesh();
topRadius = Mathf.Lerp(topRadius_start, topRadius_end, LerpValue);
bottomRadius = Mathf.Lerp(bottomRadius_start, bottomRadius_end, LerpValue);
height = Mathf.Lerp(height_start, height_end, LerpValue);
DrawMesh();
}
MeshFilter mf;
Mesh mesh;
private bool isFirst = true;
private void DrawMesh(){
//매쉬 초기화
if (mesh == null){
mesh = new Mesh();
mf = GetComponent<MeshFilter>();
mf.mesh = mesh;
}
mesh.Clear();
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();
if(isFirst){
isFirst = false;
// 메터리얼 할당
MeshRenderer renderer = GetComponent<MeshRenderer>();
renderer.material = cylinderMaterial;
}
}
}