public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        VectorMapSegmentBuilder vectorMapSegment = (VectorMapSegmentBuilder)target;

        Undo.RecordObject(vectorMapSegment, "change points");

        if (GUILayout.Button("Add Point"))
        {
            vectorMapSegment.AddPoint();
        }

        if (GUILayout.Button("Remove Point"))
        {
            vectorMapSegment.RemovePoint();
        }

        if (GUILayout.Button("Reverse Points"))
        {
            vectorMapSegment.ReversePoints();
        }

        if (GUILayout.Button("Reset Points"))
        {
            vectorMapSegment.ResetPoints();
        }
    }
    protected virtual void OnSceneGUI()
    {
        VectorMapSegmentBuilder vmSegBuilder = (VectorMapSegmentBuilder)target;

        Undo.RecordObject(vmSegBuilder, "Segment points change");

        var localPositions = vmSegBuilder.segment.targetLocalPositions;

        var pointCount = localPositions.Count;

        if (pointCount < 1)
        {
            return;
        }

        Transform mainTrans = vmSegBuilder.transform;

        if (vmSegBuilder.showHandles)
        {
            for (int i = 0; i < pointCount - 1; i++)
            {
                Vector3 newTargetPosition = Handles.PositionHandle(mainTrans.TransformPoint(localPositions[i]), Quaternion.identity);
                localPositions[i] = mainTrans.InverseTransformPoint(newTargetPosition);
            }
            Vector3 lastPoint = Handles.PositionHandle(mainTrans.TransformPoint(localPositions[pointCount - 1]), Quaternion.identity);
            localPositions[pointCount - 1] = mainTrans.InverseTransformPoint(lastPoint);
        }
    }
    protected override void OnSceneGUI()
    {
        base.OnSceneGUI();

        VectorMapSegmentBuilder vmSegBuilder = (VectorMapSegmentBuilder)target;

        Undo.RecordObject(vmSegBuilder, "Segment points change");

        var localPositions = vmSegBuilder.segment.targetLocalPositions;

        var pointCount = localPositions.Count;

        if (pointCount < 2)
        {
            return;
        }

        Transform mainTrans = vmSegBuilder.transform;

        for (int i = 0; i < pointCount - 1; i++)
        {
            Handles.color = segmentPointColor;
            Handles.DrawWireDisc(mainTrans.TransformPoint(localPositions[i]), Vector3.up, VectorMapTool.PROXIMITY * 0.5f);
            Handles.color = rayColor;
            Handles.DrawLine(mainTrans.TransformPoint(localPositions[i]), mainTrans.TransformPoint(localPositions[i + 1]));
        }

        Handles.color = segmentPointColor;
        Handles.DrawWireDisc(mainTrans.TransformPoint(localPositions[pointCount - 1]), Vector3.up, VectorMapTool.PROXIMITY * 0.5f);
    }