using System.Collections.Generic; using System.Linq; using Unity.Mathematics; using UnityEngine; using UnityEngine.Splines; /// /// Collection of commonly used functions in the Spline package. /// class SplineExamples : MonoBehaviour { void Example() { // Splines exist in a scene as properties in a SplineContainer. The relationship of splines to SplineContainer // is similar to the relationship between Mesh and MeshFilter. var container = GetComponent(); // SplineContainer can hold many splines. Access those splines through the Splines property. IReadOnlyList splines = container.Splines; // Get the position along a spline at a ratio from 0 to 1. 0 is the beginning of the spline and 1 is the end of the spline. // Call the SplineContainer version of EvaluatePosition to get results in world space. float3 worldPosition = container.EvaluatePosition(.5f); // Get the position, tangent, and direction of a spline at a location along a spline, and then rotate a GameObject to match the position and rotation of the spline. container.Evaluate(.3f, out var position, out var tangent, out var normal); transform.position = position; transform.rotation = Quaternion.LookRotation(tangent); // Knot connections are stored in the KnotLinkConnection type. var links = container.KnotLinkCollection; // Knots are referenced by an index to the SplineContainer.Splines array and Knot Index. // This example queries whether any knots are linked to the fourth knot of the first spline. var knotIndex = new SplineKnotIndex(0, 3); if (links.TryGetKnotLinks(knotIndex, out var linked)) Debug.Log($"found {linked.Count} connected knots!"); // SplineSlice represents a partial or complete range of curves from another spline. Slices can iterate either forwards or backwards. // A slice is a value type and does not make copies of the referenced spline. A slice is not resource intensive to create. // Create a new spline from the first curve of another spline. var slice = new SplineSlice(splines.First(), new SplineRange(0, 2)); // Create a SplinePath to evaluate multiple slices of many splines as a single path. var path = new SplinePath(new SplineSlice[] { slice, // This range starts at the fourth knot and iterates backwards by three indices. new SplineSlice(splines[1], new SplineRange(3, -3)) }); // SplinePath implements ISpline, which you can evaluate with any of the usual SplineUtility methods. var _ = path.EvaluatePosition(.42f); // If performance is a concern, use NativeSpline. NativeSpline is a NativeArray backed representation of // any ISpline type. NativeSpline is very efficient to query because all transformations are baked at construction. // Unlike Spline, NativeSpline is not mutable. using var native = new NativeSpline(path, transform.localToWorldMatrix); } }