반응형
절차적 메시로 만든 메시를 저장해서 Asset 폴더에 남겨보자.
절차적 메시로 정다각뿔, 원뿔 그리기 개선에서 사용한 스크립트를 수정한다.
아래의 코드만 추가하면 된다.
#if UNITY_EDITOR
using UnityEditor;
#endif
#if UNITY_EDITOR
[ContextMenu("SaveMesh")]
void saveMesh()
{
string path = "Assets/MyMesh.asset";
AssetDatabase.CreateAsset(mesh, AssetDatabase.GenerateUniqueAssetPath(path));
AssetDatabase.SaveAssets();
}
#endif
ContextMenu를 이용하면 유니티 인스펙터에서 함수를 실행할 수 있다.
이제 런타임에 정N각뿔을 만들고 SaveMesh를 인스펙터에서 실행하자.
유니티 큐브에서 Mesh를 교체하고 Collider까지 교체하면 저장한 MyMesh를 잘 사용할 수 있다는 것을 알 수 있다.
전체 코드는 다음과 같다.
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class ProceduralRegularPyramidsUpgrade : MonoBehaviour
{
public int polygon = 3;
public float size = 1.0f;
public float height = 1.0f;
public Vector3 offset = new Vector3(0, 0, 0);
Mesh mesh;
Vector3[] vertices;
int[] triangles;
#if UNITY_EDITOR
[ContextMenu("SaveMesh")]
void saveMesh()
{
string path = "Assets/MyMesh.asset";
AssetDatabase.CreateAsset(mesh, AssetDatabase.GenerateUniqueAssetPath(path));
AssetDatabase.SaveAssets();
}
#endif
public void makePolygon(int polygon)
{
setMeshData(size, polygon);
createProceduralMesh();
}
void OnValidate()
{
if (mesh == null) return;
if (size > 0 || offset.magnitude > 0 || polygon >= 3 || height > 0)
{
setMeshData(size, polygon);
createProceduralMesh();
}
}
void Start()
{
mesh = GetComponent<MeshFilter>().mesh;
setMeshData(size, polygon);
createProceduralMesh();
}
void setMeshData(float size, int polygon)
{
vertices = new Vector3[polygon + 1 + (polygon + 1)];
vertices[0] = new Vector3(0, -height / 2.0f, 0) + offset;
for (int i = 1; i <= polygon; i++)
{
float angle = -i * (Mathf.PI * 2.0f) / polygon;
vertices[i]
= (new Vector3(Mathf.Cos(angle) * size, -height / 2.0f, Mathf.Sin(angle) * size)) + offset;
}
triangles = new int[3 * polygon + 3 * polygon];
for (int i = 0; i < polygon - 1; i++)
{
triangles[i * 3] = 0;
triangles[i * 3 + 1] = i + 2;
triangles[i * 3 + 2] = i + 1;
}
triangles[3 * polygon - 3] = 0;
triangles[3 * polygon - 2] = 1;
triangles[3 * polygon - 1] = polygon;
/* -------------------------------------------------------- */
int vIdx = polygon + 1;
vertices[vIdx++] = new Vector3(0, height / 2.0f, 0) + offset;
for (int i = 1; i <= polygon; i++)
{
float angle = -i * (Mathf.PI * 2.0f) / polygon;
vertices[vIdx++]
= (new Vector3(Mathf.Cos(angle) * size, -height / 2.0f, Mathf.Sin(angle) * size)) + offset;
}
int tIdx = 3 * polygon;
for(int i = 0; i < polygon - 1; i++)
{
triangles[tIdx++] = (polygon + 1) + i + 1;
triangles[tIdx++] = (polygon + 1) + i + 2;
triangles[tIdx++] = (polygon + 1);
}
triangles[tIdx++] = (polygon + 1) + polygon;
triangles[tIdx++] = (polygon + 1) + 1;
triangles[tIdx++] = (polygon + 1);
}
void createProceduralMesh()
{
mesh.Clear();
mesh.vertices = vertices;
mesh.triangles = triangles;
mesh.RecalculateNormals();
Destroy(this.GetComponent<MeshCollider>());
this.gameObject.AddComponent<MeshCollider>();
}
}
위의 실행결과는 아래의 unitypackage에서 확인 가능하다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
댓글