MRが楽しい

MRやVRについて学習したことを書き残す

UnityのMeshクラスで作成したメッシュをAssetsフォルダに出力する

本日は Unity の技術調査枠です。
UnityのMeshクラスで作成したメッシュをAssetsフォルダに出力する手順を記事にします。

Mesh

スクリプトからメッシュの作成や変更を行うUnityEngineのクラスです。
Meshクラスには頂点データや面データが含まれていてサーフェス形式の3Dモデルを形成します。
docs.unity3d.com

作成したメッシュはMeshFilterに引き渡して各種コンポーネントがアクセスできるようにします。
メッシュをレンダリング(描画)するにはMeshRendererコンポーネントを利用します。
docs.unity3d.com
docs.unity3d.com

作成したメッシュをAssetsフォルダに出力する場合はAssetDatabase.CreateAsset関数を使用します。
docs.unity3d.com
docs.unity3d.com

Color color = Color.red;
Material material = new Material(Shader.Find("Specular"));
AssetDatabase.CreateAsset(material, "Assets/Artifacts/material.mat");
material.SetColor("_Color", color);
AssetDatabase.SaveAssets();

サンプルスクリプト

以下の前回記事を参考にシーンの再生と共にCubeの形状を作成するスクリプトを作成しました。
bluebirdofoz.hatenablog.com

今回は更に、作成したCubeのメッシュをAssetsフォルダに出力するボタンをEditor拡張で追加しました。
・CubeMesh.cs

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class CubeMesh : MonoBehaviour
{
    [SerializeField] private Material _material;
    
    void Start()
    {
        // メッシュを作成
        Mesh mesh = new Mesh();

        // 頂点リストを作成
        List<Vector3> vertices = new List<Vector3>
        {
            new Vector3(1.0f, 1.0f, 1.0f),
            new Vector3(-1.0f, 1.0f, 1.0f),
            new Vector3(-1.0f, -1.0f, 1.0f),
            new Vector3(1.0f, -1.0f, 1.0f),
            new Vector3(1.0f, -1.0f, -1.0f),
            new Vector3(-1.0f, -1.0f, -1.0f),
            new Vector3(-1.0f, 1.0f, -1.0f),
            new Vector3(1.0f, 1.0f, -1.0f),
        };

        // 面を構成するインデックスリストを作成
        List<int> triangles = new List<int> {
            0, 1, 2,  // 奥面
            0, 2, 3,  // 奥面
            4, 5, 6,  // 前面
            4, 6, 7,  // 前面
            0, 4, 7,  // 右面
            0, 3, 4,  // 右面
            6, 2, 1,  // 左面
            6, 5, 2,  // 左面
            6, 1, 0,  // 上面
            7, 6, 0,  // 上面
            4, 3, 2,  // 下面
            5, 4, 2,  // 下面
        };

        // メッシュに頂点を登録する
        mesh.SetVertices(vertices);

        // メッシュに面を構成するインデックスリストを登録する
        mesh.SetTriangles(triangles, 0);

        // 作成したメッシュをメッシュフィルターに設定する
        MeshFilter meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = mesh;
        
        // メッシュにマテリアルを設定する
        MeshRenderer meshRenderer = GetComponent<MeshRenderer>();
        meshRenderer.material = _material;
    }
    
#if UNITY_EDITOR
    // 作成したCubeのメッシュをAssetsフォルダに出力するためのエディタ拡張
    [CustomEditor(typeof(CubeMesh))]
    public class CubeMeshEditor : UnityEditor.Editor
    {
        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();
            var cubeMesh = target as CubeMesh;
            // 生成したMeshをAssetフォルダにエクスポートする
            if (GUILayout.Button("Export Mesh"))
            {
                if (!Application.isPlaying) return;
                if (cubeMesh is null) return;
                var mesh = cubeMesh.GetComponent<MeshFilter>().sharedMesh;
                AssetDatabase.CreateAsset(mesh, "Assets/Sandbox/MeshTest/ExportMesh/CubeMesh.asset");
                AssetDatabase.SaveAssets();
            }
        }
    }
#endif
}

シーンを再生すると、メッシュが構築されてCubeが生成されます。

この状態でサンプルスクリプトのInspectorに表示されている[Export Mesh]ボタンを押下すると以下のフォルダにAssetsファイルが出力されます。

Assets/Sandbox/MeshTest/ExportMesh/CubeMesh.asset

出力されたCubeMesh.assetを確認すると、Cubeの形状のメッシュデータが確認できます。