static void ExportBezierSpline(MenuCommand command)
        {
            string savePath = EditorUtility.SaveFilePanel("Export to", null, "spline", "json");

            if (string.IsNullOrEmpty(savePath))
            {
                return;
            }

            BezierSpline spline = (BezierSpline)command.context;

            SavedSpline savedSpline = new SavedSpline()
            {
                loop   = spline.loop,
                points = new SavedSpline.SavedPoint[spline.Count]
            };

            for (int i = 0; i < spline.Count; i++)
            {
                BezierPoint point = spline[i];

                savedSpline.points[i] = new SavedSpline.SavedPoint()
                {
                    position          = point.localPosition,
                    rotation          = point.localRotation,
                    scale             = point.localScale,
                    handleMode        = point.handleMode,
                    precedingPosition = point.precedingControlPointLocalPosition,
                    followingPosition = point.followingControlPointLocalPosition
                };
            }

            File.WriteAllText(savePath, JsonUtility.ToJson(savedSpline, false));
            Debug.Log("Exported to: " + savePath);
        }
        static void ImportBezierSpline(MenuCommand command)
        {
            string loadPath = EditorUtility.OpenFilePanel("Import spline", null, "json");

            if (string.IsNullOrEmpty(loadPath))
            {
                return;
            }

            SavedSpline savedSpline = JsonUtility.FromJson <SavedSpline>(File.ReadAllText(loadPath));

            if (savedSpline == null || savedSpline.points == null || savedSpline.points.Length < 2)
            {
                Debug.LogError("Invalid saved data!");
                return;
            }

            BezierSpline spline = (BezierSpline)command.context;

            spline.loop = savedSpline.loop;

            if (spline.Count > savedSpline.points.Length)
            {
                for (int i = spline.Count - 1; i >= savedSpline.points.Length; i--)
                {
                    spline.RemovePointAt(i);
                }
            }
            else
            {
                for (int i = spline.Count; i < savedSpline.points.Length; i++)
                {
                    spline.InsertNewPointAt(i);
                }
            }

            for (int i = 0; i < savedSpline.points.Length; i++)
            {
                BezierPoint            point      = spline[i];
                SavedSpline.SavedPoint savedPoint = savedSpline.points[i];

                point.localPosition = savedPoint.position;
                point.localRotation = savedPoint.rotation;
                point.localScale    = savedPoint.scale;

                point.handleMode = savedPoint.handleMode;

                point.precedingControlPointLocalPosition = savedPoint.precedingPosition;
                point.followingControlPointLocalPosition = savedPoint.followingPosition;
            }
        }