├── PrimitiveMeshAssetCreator.cs └── README.md /PrimitiveMeshAssetCreator.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEditor; 3 | 4 | public static class PrimitiveMeshAssetCreator 5 | { 6 | [MenuItem("Assets/Create/Primitive Meshes")] 7 | static void CreatePrimitiveMeshes () 8 | { 9 | var dirName = "Primitive Meshes"; 10 | var dirPath = "Assets/" + dirName; 11 | 12 | if (!System.IO.Directory.Exists (dirPath)) { 13 | AssetDatabase.CreateFolder ("Assets", dirName); 14 | } 15 | 16 | CreateOrReplaceAsset (CreateXYQuadMesh (), dirPath + "/XYQuad.asset"); 17 | CreateOrReplaceAsset (CreateXYQuadWireMesh (), dirPath + "/XYQuadWire.asset"); 18 | CreateOrReplaceAsset (CreateXYQuadWireSolidMesh (), dirPath + "/XYQuadWireSolid.asset"); 19 | CreateOrReplaceAsset (CreateIcosahedronMesh (), dirPath + "/Icosahedron.asset"); 20 | CreateOrReplaceAsset (CreateIcosahedronWireMesh (), dirPath + "/IcosahedronWire.asset"); 21 | CreateOrReplaceAsset (CreateIcosahedronWireSolidMesh (), dirPath + "/IcosahedronWireSolid.asset"); 22 | } 23 | 24 | static void CreateOrReplaceAsset (Mesh mesh, string path) 25 | { 26 | var meshAsset = AssetDatabase.LoadAssetAtPath (path, typeof(Mesh)) as Mesh; 27 | if (meshAsset == null) { 28 | meshAsset = new Mesh (); 29 | EditorUtility.CopySerialized (mesh, meshAsset); 30 | AssetDatabase.CreateAsset (meshAsset, path); 31 | } else { 32 | EditorUtility.CopySerialized (mesh, meshAsset); 33 | AssetDatabase.SaveAssets (); 34 | } 35 | } 36 | 37 | static Mesh CreateXYQuadMesh () 38 | { 39 | var mesh = new Mesh (); 40 | 41 | var vertices = new Vector3 [8]; 42 | vertices [0] = vertices [5] = new Vector3 (-1, +1, 0); 43 | vertices [1] = vertices [4] = new Vector3 (+1, +1, 0); 44 | vertices [2] = vertices [7] = new Vector3 (-1, -1, 0); 45 | vertices [3] = vertices [6] = new Vector3 (+1, -1, 0); 46 | mesh.vertices = vertices; 47 | 48 | var uvs = new Vector2 [8]; 49 | uvs [0] = uvs [5] = new Vector2 (0, 0); 50 | uvs [1] = uvs [4] = new Vector2 (1, 0); 51 | uvs [2] = uvs [7] = new Vector2 (0, 1); 52 | uvs [3] = uvs [6] = new Vector2 (1, 1); 53 | mesh.uv = uvs; 54 | 55 | var indices = new int[] {0, 1, 2, 3, 2, 1, 4, 5, 6, 7, 6, 5}; 56 | mesh.SetIndices (indices, MeshTopology.Triangles, 0); 57 | 58 | mesh.RecalculateNormals (); 59 | return mesh; 60 | } 61 | 62 | static Mesh CreateXYQuadWireMesh () 63 | { 64 | var mesh = new Mesh (); 65 | 66 | var vertices = new Vector3 [4]; 67 | vertices [0] = new Vector3 (-1, +1, 0); 68 | vertices [1] = new Vector3 (+1, +1, 0); 69 | vertices [2] = new Vector3 (-1, -1, 0); 70 | vertices [3] = new Vector3 (+1, -1, 0); 71 | mesh.vertices = vertices; 72 | 73 | var uvs = new Vector2 [4]; 74 | uvs [0] = new Vector2 (0, 0); 75 | uvs [1] = new Vector2 (1, 0); 76 | uvs [2] = new Vector2 (0, 1); 77 | uvs [3] = new Vector2 (1, 1); 78 | mesh.uv = uvs; 79 | 80 | var indices = new int[] {0, 1, 3, 2, 0}; 81 | mesh.SetIndices (indices, MeshTopology.LineStrip, 0); 82 | 83 | mesh.RecalculateNormals (); 84 | return mesh; 85 | } 86 | 87 | static Mesh CreateXYQuadWireSolidMesh () 88 | { 89 | var mesh = new Mesh (); 90 | mesh.subMeshCount = 2; 91 | 92 | var vertices = new Vector3 [8]; 93 | vertices [0] = vertices [5] = new Vector3 (-1, +1, 0); 94 | vertices [1] = vertices [4] = new Vector3 (+1, +1, 0); 95 | vertices [2] = vertices [7] = new Vector3 (-1, -1, 0); 96 | vertices [3] = vertices [6] = new Vector3 (+1, -1, 0); 97 | mesh.vertices = vertices; 98 | 99 | var uvs = new Vector2 [8]; 100 | uvs [0] = uvs [5] = new Vector2 (0, 0); 101 | uvs [1] = uvs [4] = new Vector2 (1, 0); 102 | uvs [2] = uvs [7] = new Vector2 (0, 1); 103 | uvs [3] = uvs [6] = new Vector2 (1, 1); 104 | mesh.uv = uvs; 105 | 106 | var indices = new int[] {0, 1, 2, 3, 2, 1, 4, 5, 6, 7, 6, 5}; 107 | mesh.SetIndices (indices, MeshTopology.Triangles, 0); 108 | 109 | indices = new int[] {0, 1, 3, 2, 0}; 110 | mesh.SetIndices (indices, MeshTopology.LineStrip, 1); 111 | 112 | mesh.RecalculateNormals (); 113 | return mesh; 114 | } 115 | 116 | static Mesh CreateIcosahedronMesh () 117 | { 118 | var mesh = new Mesh (); 119 | 120 | var t = (1.0f + Mathf.Sqrt (5.0f)) / 2.0f; 121 | 122 | var vertices = new Vector3[] { 123 | new Vector3 (-1, +t, 0).normalized, 124 | new Vector3 (+1, +t, 0).normalized, 125 | new Vector3 (-1, -t, 0).normalized, 126 | new Vector3 (+1, -t, 0).normalized, 127 | // 128 | new Vector3 (0, -1, +t).normalized, 129 | new Vector3 (0, +1, +t).normalized, 130 | new Vector3 (0, -1, -t).normalized, 131 | new Vector3 (0, +1, -t).normalized, 132 | // 133 | new Vector3 (+t, 0, -1).normalized, 134 | new Vector3 (+t, 0, +1).normalized, 135 | new Vector3 (-t, 0, -1).normalized, 136 | new Vector3 (-t, 0, +1).normalized 137 | }; 138 | 139 | var triangles = new int[] { 140 | 0, 11, 5, 141 | 0, 5, 1, 142 | 0, 1, 7, 143 | 0, 7, 10, 144 | 0, 10, 11, 145 | // 146 | 1, 5, 9, 147 | 5, 11, 4, 148 | 11, 10, 2, 149 | 10, 7, 6, 150 | 7, 1, 8, 151 | // 152 | 3, 9, 4, 153 | 3, 4, 2, 154 | 3, 2, 6, 155 | 3, 6, 8, 156 | 3, 8, 9, 157 | // 158 | 4, 9, 5, 159 | 2, 4, 11, 160 | 6, 2, 10, 161 | 8, 6, 7, 162 | 9, 8, 1 163 | }; 164 | 165 | // Convert to split vertices. 166 | var vertices2 = new Vector3[triangles.Length]; 167 | for (var i = 0; i < triangles.Length; i++) { 168 | vertices2 [i] = vertices [triangles [i]]; 169 | } 170 | 171 | var triangles2 = new int[triangles.Length]; 172 | for (var i = 0; i < triangles.Length; i++) { 173 | triangles2 [i] = i; 174 | } 175 | 176 | mesh.vertices = vertices2; 177 | mesh.triangles = triangles2; 178 | mesh.uv = new Vector2[triangles.Length]; 179 | 180 | mesh.Optimize (); 181 | mesh.RecalculateNormals (); 182 | return mesh; 183 | } 184 | 185 | static Mesh CreateIcosahedronWireMesh () 186 | { 187 | var mesh = new Mesh (); 188 | 189 | var t = (1.0f + Mathf.Sqrt (5.0f)) / 2.0f; 190 | 191 | mesh.vertices = new Vector3[] { 192 | new Vector3 (-1, +t, 0).normalized, 193 | new Vector3 (+1, +t, 0).normalized, 194 | new Vector3 (-1, -t, 0).normalized, 195 | new Vector3 (+1, -t, 0).normalized, 196 | // 197 | new Vector3 (0, -1, +t).normalized, 198 | new Vector3 (0, +1, +t).normalized, 199 | new Vector3 (0, -1, -t).normalized, 200 | new Vector3 (0, +1, -t).normalized, 201 | // 202 | new Vector3 (+t, 0, -1).normalized, 203 | new Vector3 (+t, 0, +1).normalized, 204 | new Vector3 (-t, 0, -1).normalized, 205 | new Vector3 (-t, 0, +1).normalized 206 | }; 207 | 208 | mesh.SetIndices (new int[] { 209 | 0, 1, 210 | 0, 5, 211 | 0, 7, 212 | 0, 10, 213 | 0, 11, 214 | 1, 5, 215 | 1, 7, 216 | 1, 8, 217 | 1, 9, 218 | 2, 3, 219 | 2, 4, 220 | 2, 6, 221 | 2, 10, 222 | 2, 11, 223 | 3, 4, 224 | 3, 6, 225 | 3, 8, 226 | 3, 9, 227 | 4, 5, 228 | 4, 9, 229 | 4, 11, 230 | 5, 9, 231 | 5, 11, 232 | 6, 7, 233 | 6, 8, 234 | 6, 10, 235 | 7, 8, 236 | 7, 10, 237 | 8, 9, 238 | 10, 11 239 | }, MeshTopology.Lines, 0); 240 | 241 | mesh.uv = new Vector2[12]; 242 | 243 | mesh.Optimize (); 244 | mesh.RecalculateNormals (); 245 | return mesh; 246 | } 247 | 248 | static Mesh CreateIcosahedronWireSolidMesh () 249 | { 250 | var mesh = new Mesh (); 251 | mesh.subMeshCount = 2; 252 | 253 | var t = (1.0f + Mathf.Sqrt (5.0f)) / 2.0f; 254 | 255 | var vertices = new Vector3[] { 256 | new Vector3 (-1, +t, 0).normalized, 257 | new Vector3 (+1, +t, 0).normalized, 258 | new Vector3 (-1, -t, 0).normalized, 259 | new Vector3 (+1, -t, 0).normalized, 260 | // 261 | new Vector3 (0, -1, +t).normalized, 262 | new Vector3 (0, +1, +t).normalized, 263 | new Vector3 (0, -1, -t).normalized, 264 | new Vector3 (0, +1, -t).normalized, 265 | // 266 | new Vector3 (+t, 0, -1).normalized, 267 | new Vector3 (+t, 0, +1).normalized, 268 | new Vector3 (-t, 0, -1).normalized, 269 | new Vector3 (-t, 0, +1).normalized 270 | }; 271 | 272 | var triangles = new int[] { 273 | 0, 11, 5, 274 | 0, 5, 1, 275 | 0, 1, 7, 276 | 0, 7, 10, 277 | 0, 10, 11, 278 | // 279 | 1, 5, 9, 280 | 5, 11, 4, 281 | 11, 10, 2, 282 | 10, 7, 6, 283 | 7, 1, 8, 284 | // 285 | 3, 9, 4, 286 | 3, 4, 2, 287 | 3, 2, 6, 288 | 3, 6, 8, 289 | 3, 8, 9, 290 | // 291 | 4, 9, 5, 292 | 2, 4, 11, 293 | 6, 2, 10, 294 | 8, 6, 7, 295 | 9, 8, 1 296 | }; 297 | 298 | var lines = new int[] { 299 | 0, 1, 300 | 0, 5, 301 | 0, 7, 302 | 0, 10, 303 | 0, 11, 304 | 1, 5, 305 | 1, 7, 306 | 1, 8, 307 | 1, 9, 308 | 2, 3, 309 | 2, 4, 310 | 2, 6, 311 | 2, 10, 312 | 2, 11, 313 | 3, 4, 314 | 3, 6, 315 | 3, 8, 316 | 3, 9, 317 | 4, 5, 318 | 4, 9, 319 | 4, 11, 320 | 5, 9, 321 | 5, 11, 322 | 6, 7, 323 | 6, 8, 324 | 6, 10, 325 | 7, 8, 326 | 7, 10, 327 | 8, 9, 328 | 10, 11 329 | }; 330 | 331 | // Convert to split vertices. 332 | var vertices2 = new Vector3[triangles.Length]; 333 | for (var i = 0; i < triangles.Length; i++) { 334 | vertices2 [i] = vertices [triangles [i]]; 335 | } 336 | 337 | var triangles2 = new int[triangles.Length]; 338 | for (var i = 0; i < triangles.Length; i++) { 339 | triangles2 [i] = i; 340 | } 341 | 342 | mesh.vertices = vertices2; 343 | mesh.SetIndices (triangles2, MeshTopology.Triangles, 0); 344 | mesh.uv = new Vector2[triangles.Length]; 345 | 346 | // Calculate the normal vectore before setting the lines. 347 | mesh.RecalculateNormals (); 348 | 349 | // Look up the proper vertex index from the triangle array. 350 | for (var i = 0; i < lines.Length; i++) { 351 | var vi = lines [i]; 352 | for (var tvi = 0; tvi < triangles.Length; tvi++) { 353 | if (triangles [tvi] == vi) { 354 | lines [i] = tvi; 355 | break; 356 | } 357 | } 358 | } 359 | 360 | mesh.SetIndices (lines, MeshTopology.Lines, 1); 361 | 362 | mesh.Optimize (); 363 | return mesh; 364 | } 365 | } 366 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | unity-primitive-mesh-asset-creator 2 | ================================== 3 | 4 | An editor script to create some primitive mesh assets programmaticaly. 5 | 6 | Usage 7 | ----- 8 | 9 | 1. Import PrimitiveMeshAssetCreator.cs into the Assets/Editor folder. 10 | 2. Assets -> Create -> Primitive Meshes 11 | --------------------------------------------------------------------------------