public override void OnInspectorGUI()
        {
            LinePath linePath = (LinePath)target;

            if (linePath.Points.Count > 0)
            {
                int remove = -1;
                for (int i = 0; i < linePath.Points.Count; i++)
                {
                    EditorGUILayout.BeginHorizontal();
                    Vector2 localPositionBefore = linePath.Points[i];
                    Vector2 worldPosition       = localPositionBefore + new Vector2(linePath.transform.position.x, linePath.transform.position.y);
                    worldPosition = EditorGUILayout.Vector2Field("Point " + (i + 1), worldPosition);
                    Vector2 localPositionAfter = worldPosition - new Vector2(linePath.transform.position.x, linePath.transform.position.y);
                    if (localPositionBefore != localPositionAfter)
                    {
                        Undo.RecordObject(linePath, "Move Point");
                        linePath.Points[i] = localPositionAfter;
                    }
                    if (GUILayout.Button("Delete"))
                    {
                        remove = i;
                    }
                    EditorGUILayout.EndHorizontal();
                }

                if (remove != -1)
                {
                    Undo.RecordObject(linePath, "Delete Point from Path");
                    linePath.Points.RemoveAt(remove);
                }

                bool tempAllowOffset = EditorGUILayout.Toggle("Allow Offset", linePath.AllowOffset);
                if (linePath.AllowOffset != tempAllowOffset)
                {
                    Undo.RecordObject(linePath, "Change AllowOffset");
                    linePath.AllowOffset = tempAllowOffset;
                }
            }
            else
            {
                GUILayout.Label("Shift-Click to add points");
            }

            SceneView.RepaintAll();
        }
        void OnSceneGUI()
        {
            LinePath linePath = (LinePath)target;

            Event e = Event.current;

            if (e.type == EventType.MouseDown && e.shift)
            {
                Undo.RecordObject(linePath, "Add Point to Path");
                Ray ray = HandleUtility.GUIPointToWorldRay(e.mousePosition);
                linePath.Points.Add(new Vector2(ray.origin.x - linePath.transform.position.x, ray.origin.y - linePath.transform.position.y));
                linePath.Points.Sort((a, b) => {
                    return(a.x.CompareTo(b.x));
                });
            }

            Vector3[] pointsArray = new Vector3[linePath.Points.Count];
            for (int i = 0; i < linePath.Points.Count; i++)
            {
                pointsArray[i] = new Vector3(linePath.transform.position.x + linePath.Points[i].x,
                                             linePath.transform.position.y + linePath.Points[i].y);
            }

            Handles.color = Color.red;
            Handles.DrawPolyLine(pointsArray);

            float  handleSize = 1.0f;
            Camera camera     = Camera.current;

            if (camera != null)
            {
                handleSize = Mathf.Abs(camera.transform.position.z) / 200.0f;
            }

            Handles.color = Color.white;
            for (int i = 0; i < linePath.Points.Count; i++)
            {
                Vector3 before = new Vector3(linePath.Points[i].x, linePath.Points[i].y);
                Vector3 after  = Handles.Slider2D(i + 1, before, linePath.transform.position, Vector3.up, Vector3.up, Vector3.left, handleSize, Handles.DotCap, Vector2.one * 0.1f);
                if (before != after)
                {
                    Undo.RecordObject(linePath, "Move Point");
                    linePath.Points[i] = new Vector3(after.x, after.y, 0);
                }
            }
        }