polygons

Regular Polygons Fresh From The Editor

October 8, 2013      Development, Games      esdin      no responses

Tagged with:



I’ve been trying to get back in to some more independent development lately, and the first thing I re-built was a quick and dirty editor script that lets you easily pump out arbitrarily scaled regular polygons. Great for making some quick geometric shapes or just replacing Unity’s default plane with a simple quad.

using UnityEngine;
using UnityEditor;
using System.Collections;

public class CreatePolygon : ScriptableWizard
{

    public enum Orientation
    {
        Horizontal,
        Vertical
    }

    public float scale = 1.0f;
	public int sides = 4;
	public float angle = 90.0f;
	public bool addCollider = false;
	public string optionalName = "Polygon";

    [MenuItem("GameObject/Create Other/Custom Polygon...")]
    static void CreateWizard()
    {
        ScriptableWizard.DisplayWizard("Create Polygon",typeof(CreatePolygon));
    }

    void OnWizardUpdate()
    {
		sides = Mathf.Clamp(sides, 3, 100);
    }

    void OnWizardCreate()
    {
        GameObject polygon = new GameObject();

        if (!string.IsNullOrEmpty(optionalName))
            polygon.name = optionalName;
        else
            polygon.name = "Polygon";

		polygon.transform.position = Vector3.zero;

        MeshFilter meshFilter = (MeshFilter)polygon.AddComponent(typeof(MeshFilter));
        polygon.AddComponent(typeof(MeshRenderer));

        string polygonAssetName = polygon.name + "_Sides"+sides.ToString()+"_Scale"+scale.ToString();
		Mesh m = (Mesh)AssetDatabase.LoadAssetAtPath("Assets/Editor/" + polygonAssetName,typeof(Mesh));

        if (m == null)
        {
            m = new Mesh();
            m.name = polygon.name;

            int numTriangles = (sides-2);
            int numVertices = sides;

            Vector3[] vertices = new Vector3[numVertices];
            Vector2[] uvs = new Vector2[numVertices];
            int[] triangles = new int[numTriangles*3];

            for(int i=0; i<sides;i++) {
				float ang = i * (Mathf.PI*2.0f/sides) + Mathf.Deg2Rad*angle;
				vertices[i] = new Vector3(Mathf.Sin(ang), Mathf.Cos(ang), 0);
				uvs[i] = new Vector2((vertices[i].x+1)*0.5f, (vertices[i].y+1)*0.5f);
				vertices[i] *= scale;
			}

			for(int i=0; i<numTriangles;i++) {
				triangles[i*3]=0;
				triangles[i*3+1]=i+1;
				triangles[i*3+2]=i+2;
			}

            m.vertices = vertices;
            m.uv = uvs;
            m.triangles = triangles;
            m.RecalculateNormals();

            AssetDatabase.CreateAsset(m, "Assets/Editor/" + polygonAssetName);
            AssetDatabase.SaveAssets();
        }

        meshFilter.sharedMesh = m;
        m.RecalculateBounds();

        if (addCollider)
            polygon.AddComponent(typeof(MeshCollider));

        Selection.activeObject = polygon;
    }
}
Creative Commons License
This work by http://www.idle-chatter.com is licensed under a Creative Commons Attribution 3.0 United States License.
Based on a work at www.idle-chatter.com.
Permissions beyond the scope of this license may be available at http://www.idle-chatter.com.


Leave a Reply