Examples

Using Math

        //get math
        var math = GetComponent<BGCcMath>();

        //====Total length
        //get total spline's length
        var totalDistance = math.GetDistance();

        //====Position (World)
        //get position at 1 meter from the start
        var positionAtOneMeter = math.CalcByDistance(BGCurveBaseMath.Field.Position, 1);
        //get position at the center of the spline
        var positionAtSplineCenter = math.CalcByDistanceRatio(BGCurveBaseMath.Field.Position, .5f);

        //====Tangent (World)
        //get tangent at 1 meter from the start
        var tangentAtOneMeter = math.CalcByDistance(BGCurveBaseMath.Field.Tangent, 1);
        //get tangent at the center of the spline
        var tangentAtSplineCenter = math.CalcByDistanceRatio(BGCurveBaseMath.Field.Tangent, .5f);

        //====Position and Tangent (World)
        //get position and tangent at 1 meter from the start
        Vector3 tangAtOneMeter;
        var posAtOneMeter = math.CalcPositionAndTangentByDistance(1, out tangAtOneMeter);
        //get position and tangent at the center of the spline
        Vector3 tangAtSplineCenter;
        var posAtSplineCenter = math.CalcPositionAndTangentByDistanceRatio(.5f, out tangAtSplineCenter);

        //====Section index
        //get section index at 1 meter from the start
        var sectionIndexAtOneMeterFromStart = math.CalcSectionIndexByDistance(1);
        //get section index at the center of the spline
        var sectionIndexAtSplineCenter = math.CalcSectionIndexByDistanceRatio(.5f);

        //====Distance to point
        //get distance at point #1 (#0-start point, #1-second point from start)
        //math.Math[0] return info about 1st section
        var distanceToFirstPoint = math.Math[0].DistanceFromEndToOrigin;

        //====Position and Distance to closest point
        //use this picture as a reference http://www.bansheegz.com/images/DGMathCalcPositionByClosestPoint.jpg
        //assuming green point is Vector3.zero
        //positionYellow - the position of the yellow point
        var positionYellow = math.CalcPositionByClosestPoint(Vector3.zero);
        //distanceYellow - the length of yellow arrow
        float distanceYellow;
        //positionYellow2 - the position of the yellow point
        var positionYellow2 = math.CalcPositionByClosestPoint(Vector3.zero, out distanceYellow);
        //distanceGreen- the length of green arrow
        var distanceGreen = Vector3.Distance(math.CalcPositionByClosestPoint(Vector3.zero), Vector3.zero);

Minimalistic example for moving and rotating some object along the spline

using UnityEngine;
using BansheeGz.BGSpline.Components;

[RequireComponent(typeof(BGCcMath))]
public class Test : MonoBehaviour
{
   public Transform ObjectToMove;
   private float distance;

   void Update()
   {
       //increase distance
       distance += 5 * Time.deltaTime;

       //calculate position and tangent
       Vector3 tangent;
       ObjectToMove.position = GetComponent<BGCcMath>().CalcPositionAndTangentByDistance(distance, out tangent);
       ObjectToMove.rotation = Quaternion.LookRotation(tangent);
   }
}

Accessing points

    private BGCurve curve;

    void Start()
    {
        curve = GetComponent<BGCurve>();

        //cache the point
        var point = curve[0];

        //position
        print("Position World=" + point.PositionWorld);
        print("Position Local=" + point.PositionLocal);
        print("Position Local Transformed=" + point.PositionLocalTransformed);

        //control type
        print("Control Type=" + point.ControlType);

        //control 1 (Inbound)
        print("Control 1 World=" + point.ControlFirstWorld);
        print("Control 1 Local=" + point.ControlFirstLocal);
        print("Control 1 Local Transformed=" + point.ControlFirstLocalTransformed);

        //control 2 (Outbound)
        print("Control 2 World=" + point.ControlSecondWorld);
        print("Control 2 Local=" + point.ControlSecondLocal);
        print("Control 2 Local Transformed=" + point.ControlSecondLocalTransformed);

        //all properties have corresponding 'setter'
        //see 'Coordinates' section for detailed explanation of coordinate spaces
    }

Iterating points


    //cache the points and count
    var points = curve.Points;
    var pointsCount = points.Length;

    //use 'for' loop
    for (var i = 0; i < pointsCount; i++)
    {
        var point = points[i];
        //do something here
    }

Accessing spline's properties


        //closed (last first points connected)
        print("Closed:" + curve.Closed);

        //use curve.Fields to access fields
        print("# of curstom fields:" + curve.FieldsCount);

        //2D mode
        print("2D mode:" + curve.Mode2D);

        //snapping (use curve.SnapXXX to access other snap related properties)
        print("Snap type:" + curve.SnapType);

        //points mode (Inlined, Components, GameObjects)
        print("Points mode:" + curve.PointsMode);

Create a spline at runtime

    private BGCurve curve;
    private BGCcMath math;

    void Start()
    {
        //add spline
        curve = gameObject.AddComponent<BGCurve>();

        //add points
        curve.AddPoint(new BGCurvePoint(curve, Vector3.zero, BGCurvePoint.ControlTypeEnum.Absent));
        curve.AddPoint(new BGCurvePoint(curve, Vector3.right, BGCurvePoint.ControlTypeEnum.BezierSymmetrical,
            new Vector3(-0.5f, 0.5f, 0), new Vector3(0.5f, -0.5f, 0)));

        //add math solver
        math = gameObject.AddComponent<BGCcMath>();

        //print calculated values
        print("Spline's Length=" + math.GetDistance());
        print("Position at the middle=" + math.CalcByDistanceRatio(BGCurveBaseMath.Field.Position, .5f));
        print("Point, closest to Vector3.one, =" + math.CalcPositionByClosestPoint(Vector3.one));
    }

Accessing custom fields


        var point = curve[0];

        //all supported types listed below
        //C#
        var @bool = point.GetBool("yourFieldName");
        var @int = point.GetInt("yourFieldName");
        var @float = point.GetFloat("yourFieldName");
        var @string = point.GetField<string>("yourFieldName");

        //Unity structs
        var bounds = point.GetBounds("yourFieldName");
        var color = point.GetColor("yourFieldName");
        var vector3 = point.GetVector3("yourFieldName");
        var quaternion = point.GetQuaternion("yourFieldName");

        //Unity objects
        var animationCurve = point.GetField<AnimationCurve>("yourFieldName");
        var component = point.GetField<Component>("yourFieldName");
        var go = point.GetField<GameObject>("yourFieldName");

        // BG Curve related
        var bgCurve = point.GetField<BGCurve>("yourFieldName");
        var pointComponent = point.GetField<BGCurvePointComponent>("yourFieldName");
        var pointGo = point.GetField<BGCurvePointGO>("yourFieldName");

        //use corresponding SetXXX for setters