【Unity】【エディタ拡張】PlaneなMeshを簡単に作るPlaneMeshGenerator

PlaneのMeshを簡単に作るためのWindowを作るコードです。
外部ツール使うまでもなく簡単に作りたいときに。

ソースコード

早速ですがソースコードです。
メッシュ作成部分は下記のサイトのコードを参考にしています。

ProceduralPrimitives - Unify Community Wiki

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class PlaneMeshGenerator : ScriptableWizard {

    [SerializeField]
    private float _length = 1.0f;
    [SerializeField]
    private float _width  = 1.0f;
    [SerializeField]
    private int _resX     = 2;
    [SerializeField]
    private int _resZ     = 2;

    [MenuItem("Window/Mesh Generator/Plane")]
    private static void Open()
    {
        DisplayWizard<PlaneMeshGenerator>(ObjectNames.NicifyVariableName(typeof(PlaneMeshGenerator).Name));
    }

    private void OnWizardUpdate()
    {
        isValid         = true;
        if (_resX < 2 || _resZ < 2 || _length < 0.0f || _width < 0.0f) {
            isValid     = false;
        }
    }
    
    private void OnWizardCreate () 
    {
        Mesh mesh   = new Mesh();

        // 頂点座標
        Vector3[] vertices  = new Vector3[_resX * _resZ];
        for(int z = 0; z < _resZ; z++)
        {
            float zPos     = ((float)z / (_resZ - 1) - .5f) * _length;
            for(int x = 0; x < _resX; x++)
            {
                float xPos                 = ((float)x / (_resX - 1) - .5f) * _width;
                vertices[ x + z * _resX ]   = new Vector3( xPos, 0f, zPos );
            }
        }
 
        // 法線
        Vector3[] normales  = new Vector3[ vertices.Length ];
        for( int n = 0; n < normales.Length; n++ )
        {
            normales[n]     = Vector3.up;
        }
 
        // UV座標
        Vector2[] uvs       = new Vector2[ vertices.Length ];
        for(int v = 0; v < _resZ; v++)
        {
            for(int u = 0; u < _resX; u++)
            {
                uvs[ u + v * _resX ]    = new Vector2( (float)u / (_resX - 1), (float)v / (_resZ - 1) );
            }
        }
 
        // 三角形
        int nbFaces            = (_resX - 1) * (_resZ - 1);
        int[] triangles        = new int[ nbFaces * 6 ];
        int t              = 0;
        for(int face = 0; face < nbFaces; face++ )
        {
            int i = face % (_resX - 1) + (face / (_resZ - 1) * _resX);
 
            triangles[t++]  = i + _resX;
            triangles[t++]  = i + 1;
            triangles[t++]  = i;
 
            triangles[t++]  = i + _resX;    
            triangles[t++]  = i + _resX + 1;
            triangles[t++]  = i + 1; 
        }
 
        // 各頂点情報をセット
        mesh.vertices = vertices;
        mesh.normals = normales;
        mesh.uv = uvs;
        mesh.triangles = triangles;
        mesh.RecalculateBounds();
        mesh.RecalculateTangents();

        // 保存
        var filePath = EditorUtility.SaveFilePanelInProject("Save", "plane", "asset", "");
        if (!string.IsNullOrEmpty(filePath)) {
            AssetDatabase.CreateAsset(mesh, filePath);
        }
    }
}
#endif

結果

Windowメニューから選択するとこんな感じのWindowが開かれます。
大きさと分割の細かさを設定してCreateボタンを押すとMeshが作成されます。

f:id:halya_11:20180920122401p:plain

参考サイト

ProceduralPrimitives - Unify Community Wiki