Unityでメッシュをスクリプトから保存する方法

BlenderやMayaで作成した3Dモデルをインポートすることはあっても、基本的にUnity上でメッシュデータを作成することはあまりありません。

もちろんメッシュデータを動的にスクリプトから作成することは可能です。しかし、そのメッシュを含むオブジェクトをプレハブ化しようとすると、メッシュデータが空っぽになってしまいます。そして、プレハブをシーンにドロップしても、メッシュが表示されません。

これは、スクリプトから作成したメッシュデータが.assetファイルとして保存されていないことが原因です。MeshFilterの項目が空白になっていると、メッシュがアセットとして保存されていません。

アセットとして保存するには、以下のようなスクリプトでアセットとして保存してください。

using UnityEditor;
using UnityEngine;

public class MeshCreator : MonoBehaviour
{
    [SerializeField] private string path;

    [ContextMenu("Make mesh from model")]
    public void MakeMesh()
    {
#if UNITY_EDITOR
        var mesh = GetComponent<MeshFilter>();
        AssetDatabase.CreateAsset(mesh.mesh, path);
        AssetDatabase.SaveAssets();
#endif
    }
}

保存先のパスは、Assets/~/○○.assetのように指定してください。拡張子の.assetを忘れないようにしましょう。

また、アクセスしやすいようにContextMenuアトリビュートを付けてます。コンポーネントを右クリックするとポップアップが現れるので、そこから呼び出すことができます。

基本的にこうしたケースにあたることはあまりないと思いますが、ちょっとハマってしまったので記事にしました。

.assetファイルの保存は重たい処理だと思います。実行時に使いたい場合は、もうちょっと別の方法を考えたほうがいいでしょう。ここで紹介したものは、あくまでエディターをメインとしていますので、ご注意ください。

返信を残す

メールアドレスが公開されることはありません。