using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace SplineMesh { /// /// Example of component to bend a mesh along a spline with some interpolation of scales and rolls. This component can be used as-is but will most likely be a base for your own component. /// /// For explanations of the base component, /// /// In this component, we have added properties to make scale and roll vary between spline start and end. /// Intermediate scale and roll values are calculated at each spline node accordingly to the distance, then given to the MeshBenders component. /// MeshBender applies scales and rolls values by interpollation if they differ from strat to end of the curve. /// /// You can easily imagine a list of scales to apply to each node independantly to create your own variation. /// [DisallowMultipleComponent] public class ExampleTentacle : MonoBehaviour { private Spline spline { get => GetComponent(); } public float startScale = 1, endScale = 1; public float startRoll = 0, endRoll = 0; private void OnValidate() { // apply scale and roll at each node float currentLength = 0; foreach (CubicBezierCurve curve in spline.GetCurves()) { float startRate = currentLength / spline.Length; currentLength += curve.Length; float endRate = currentLength / spline.Length; curve.n1.Scale = Vector2.one * (startScale + (endScale - startScale) * startRate); curve.n2.Scale = Vector2.one * (startScale + (endScale - startScale) * endRate); curve.n1.Roll = startRoll + (endRoll - startRoll) * startRate; curve.n2.Roll = startRoll + (endRoll - startRoll) * endRate; } } } }