名古屋でアプリ・VR開発を行っています
ワクワクできるゲームをガンガン開発リリース中!

【Unity】MeshFilterのメッシュをAssetファイルとして書き出す方法

こんにちは、SAT-BOXのコアラです

Unityで動的にメッシュを作成したときに、MeshFilterにはこう表示されますよね

f:id:sat-box:20210119101846p:plain

ちなみに処理はこんな感じ

using UnityEngine;

public class ExportMesh : MonoBehaviour
{
    void Start()
    {
        // 適当なメッシュを作成
        var mesh = new Mesh();
        mesh.vertices = new Vector3[] {
            new Vector3(0.7f,0,0),
            new Vector3(-0.7f,0,0),
            new Vector3(0,1,0)
        };
        mesh.triangles = new int[] { 0, 1, 2 };

        GetComponent<MeshFilter>().sharedMesh = mesh;
    }
}

当然ですが、ファイルとして存在しているわけではないので名前がありません
この状態で実行を止めればメッシュも消えますよね

今回は、このように作成したファイルを書き出してみようと思います
さっきの処理にInspector拡張の処理を付け加えました

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class ExportMesh : MonoBehaviour
{
    void Start()
    {
        // 適当なメッシュを作成
        var mesh = new Mesh();
        mesh.vertices = new Vector3[] {
            new Vector3(0.7f,0,0),
            new Vector3(-0.7f,0,0),
            new Vector3(0,1,0)
        };
        mesh.triangles = new int[] { 0, 1, 2 };

        GetComponent<MeshFilter>().sharedMesh = mesh;
    }
}

#if UNITY_EDITOR

[CustomEditor(typeof(ExportMesh))]
public class ExportMeshEditor : Editor
{
    public override void OnInspectorGUI()
    {
        if (GUILayout.Button("Export"))
        {
            AssetDatabase.CreateAsset(((ExportMesh)target)
                .gameObject.GetComponent<MeshFilter>().sharedMesh, "Assets/mesh.asset");
        }
    }
}

#endif

AssetDatabase.CreateAssetという関数で、色々なObjectをAssetファイルとして書き出せます
このように記述すれば…

f:id:sat-box:20210119102739p:plain

Exportボタンが出現して、押したらMeshFilterのほうにもファイル名が表示されました
勿論Assetフォルダにファイルとして書き出されてます

f:id:sat-box:20210119102912p:plain

ただのInspector拡張なので、実行中じゃなくても使えます
何かに役立ててもらえればと思います