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が作成されます。