본문 바로가기
개발/Unity

유니티 - 절차적 메시로 만든 메시 저장하기 (Save Procedural Mesh)

by 피로물든딸기 2022. 11. 6.
반응형

Unity 전체 링크

 

절차적 메시로 만든 메시를 저장해서 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에서 확인 가능하다.

SaveProceduralMesh.unitypackage
0.00MB

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글