public override void OnInspectorGUI()
    {
        UIParticleEmitter script = (UIParticleEmitter)target;


        script.Loop = EditorGUILayout.Toggle("Loop", script.Loop);
        if (!script.Loop)
        {
            script.EmitterDuration = EditorGUILayout.FloatField("Duration", script.EmitterDuration);
        }



        script.sprite       = (Sprite)EditorGUILayout.ObjectField("Sprite", script.sprite, typeof(Sprite), false, GUILayout.Height(15F));
        script.EmissionRate = EditorGUILayout.IntField("Emission Rate", script.EmissionRate);


        script.sizeType = (UIParticleEmitter.SizeType)EditorGUILayout.EnumPopup("Size Type", script.sizeType);
        if (script.sizeType == UIParticleEmitter.SizeType.Single)
        {
            script.Size [0] = EditorGUILayout.FloatField("Size", script.Size [0]);
        }
        if (script.sizeType == UIParticleEmitter.SizeType.Double)
        {
            script.Size [0] = EditorGUILayout.FloatField("Size 1", script.Size [0]);
            script.Size [1] = EditorGUILayout.FloatField("Size 2", script.Size [1]);
        }

        /*if (script.sizeType == UIParticleEmitter.SizeType.Curve) {
         *      script.Size [0] = EditorGUILayout.FloatField ("Size 1", script.Size [0]);
         *      script.SizeCurveX =EditorGUILayout.CurveField ("Curve X", script.SizeCurveX);
         *      script.SizeCurveY =EditorGUILayout.CurveField ("Curve Y", script.SizeCurveY);
         * }*/


        script.PreWarm = EditorGUILayout.Toggle("PreWarm", script.PreWarm);


        script.LifeSpan = EditorGUILayout.FloatField("Life Span", script.LifeSpan);



        script.PoolSize = EditorGUILayout.IntField("Maximum Number of Particles", script.PoolSize);
        while (script.particlePool.Count + script.activeParticles.Count > script.PoolSize)
        {
            if (script.particlePool.Count > 0)
            {
                script.particlePool.RemoveAt(0);
                continue;
            }
            script.activeParticles.RemoveAt(0);
        }


        script.colorType = (UIParticleEmitter.ColorType)EditorGUILayout.EnumPopup("Color Type", script.colorType);
        if (script.colorType == UIParticleEmitter.ColorType.Single)
        {
            script.colors[0] = EditorGUILayout.ColorField("Color", script.colors[0]);
        }
        if (script.colorType == UIParticleEmitter.ColorType.Double)
        {
            script.colors[0] = EditorGUILayout.ColorField("Starting Color", script.colors[0]);
            script.colors[1] = EditorGUILayout.ColorField("End Color", script.colors[1]);
        }


        if (script.colorType == UIParticleEmitter.ColorType.Gradient)
        {
            EditorGUI.BeginChangeCheck();
            SerializedObject   serializedGradient = new SerializedObject(target);
            SerializedProperty colorGradient      = serializedGradient.FindProperty("gradient");
            EditorGUILayout.PropertyField(colorGradient, true, null);
            if (EditorGUI.EndChangeCheck())
            {
                serializedGradient.ApplyModifiedProperties();
            }
        }
        if (script.colorType == UIParticleEmitter.ColorType.Double_Gradient)
        {
            EditorGUI.BeginChangeCheck();
            SerializedObject   serializedGradient = new SerializedObject(target);
            SerializedProperty colorGradient      = serializedGradient.FindProperty("gradient");
            EditorGUILayout.PropertyField(colorGradient, true, null);
            if (EditorGUI.EndChangeCheck())
            {
                serializedGradient.ApplyModifiedProperties();
            }


            EditorGUI.BeginChangeCheck();
            SerializedObject   serializedGradient2 = new SerializedObject(target);
            SerializedProperty colorGradient2      = serializedGradient2.FindProperty("gradient2");
            EditorGUILayout.PropertyField(colorGradient2, true, null);
            if (EditorGUI.EndChangeCheck())
            {
                serializedGradient2.ApplyModifiedProperties();
            }
        }

        script.direction = (UIParticleEmitter.Direction)EditorGUILayout.EnumPopup("Emission", script.direction);



        if (script.direction == UIParticleEmitter.Direction.Radius)
        {
            //script.Radius = EditorGUILayout.FloatField ("Radius", script.Radius);
            script.innerRadius = EditorGUILayout.Slider("Inner Radius", script.innerRadius, 0f, 1f);
        }
        else if (script.direction == UIParticleEmitter.Direction.Cone)
        {
            script.Angle     = EditorGUILayout.FloatField("Angle", script.Angle);
            script.Threshold = EditorGUILayout.Slider("Threshold", script.Threshold, 0f, 1f);
        }


        script.raycastTarget = EditorGUILayout.Toggle("Raycast Target", script.raycastTarget);
        //DrawDefaultInspector ();
    }
    void OnSceneGUI()
    {
        UIParticleEmitter script = (UIParticleEmitter)target;

        if (script.direction == UIParticleEmitter.Direction.Radius)
        {
            Handles.color = new Color(0.3f, 1f, 1f, 1f);
            Vector3 startCorner = new Vector3(script.rectTransform.rect.width / 2f, 0) + script.transform.position;

            // The "previous" corner point, initialised to the starting corner.
            Vector3 previousCorner = startCorner;
            int     numSides       = 36;
            // For each corner after the starting corner...
            for (int i = 1; i < numSides + 1; i++)
            {
                // Calculate the angle of the corner in radians.
                float cornerAngle = 2f * Mathf.PI / (float)numSides * i;

                // Get the X and Y coordinates of the corner point.
                Vector3 currentCorner = new Vector3(Mathf.Cos(cornerAngle) * script.rectTransform.rect.width / 2f,
                                                    Mathf.Sin(cornerAngle) * script.rectTransform.rect.height / 2f) + script.transform.position;

                // Draw a side of the polygon by connecting the current corner to the previous one.
                Handles.DrawLine(currentCorner, previousCorner);

                // Having used the current corner, it now becomes the previous corner.
                previousCorner = currentCorner;
            }

            Handles.color  = new Color(1f, 1f, 0.3f, 1f);
            previousCorner = new Vector3((script.rectTransform.rect.width / 2f) * script.innerRadius, 0) + script.transform.position;
            for (int i = 1; i < numSides + 1; i++)
            {
                // Calculate the angle of the corner in radians.
                float cornerAngle = 2f * Mathf.PI / (float)numSides * i;

                // Get the X and Y coordinates of the corner point.
                Vector3 currentCorner = new Vector3(Mathf.Cos(cornerAngle) * (script.rectTransform.rect.width / 2f) * script.innerRadius,
                                                    Mathf.Sin(cornerAngle) * (script.rectTransform.rect.height / 2f) * script.innerRadius) + script.transform.position;

                // Draw a side of the polygon by connecting the current corner to the previous one.
                Handles.DrawLine(currentCorner, previousCorner);

                // Having used the current corner, it now becomes the previous corner.
                previousCorner = currentCorner;
            }
        }
        else if (script.direction == UIParticleEmitter.Direction.Cone)
        {
            Vector3 angle1 = Quaternion.AngleAxis(-script.Angle, Vector3.forward) * Vector3.right;
            Vector3 angle2 = Quaternion.AngleAxis(script.Angle, Vector3.forward) * Vector3.right;

            angle1 = new Vector3(angle1.x * script.rectTransform.rect.width / 2f, angle1.y * script.rectTransform.rect.height / 2f);
            angle2 = new Vector3(angle2.x * script.rectTransform.rect.width / 2f, angle2.y * script.rectTransform.rect.height / 2f);

            Vector3 line1Start = script.transform.position + (Vector3.left * script.rectTransform.rect.width * 0.5f) * (1f - script.Threshold) + angle1 * script.Threshold;
            Vector3 line2Start = script.transform.position + (Vector3.left * script.rectTransform.rect.width * 0.5f) * (1f - script.Threshold) + angle2 * script.Threshold;
            Vector3 line1End   = script.transform.position + angle1;
            Vector3 line2End   = script.transform.position + angle2;


            Handles.color = new Color(0.3f, 1f, 1f, 1f);
            Handles.DrawLine(line1Start, line2Start);
            Handles.DrawLine(line1Start, line1End);
            Handles.DrawLine(line2Start, line2End);
        }
    }