using UnityEngine; namespace Obi { [RequireComponent(typeof(ObiRopeCursor))] public class ObiRopeReel : MonoBehaviour { private ObiRopeCursor cursor; private ObiRope rope; [Header("Roll out/in thresholds")] public float outThreshold = 0.8f; public float inThreshold = 0.4f; [Header("Roll out/in speeds")] public float outSpeed = 4; public float inSpeed = 2; public float maxLength = 10; private float restLength; public void Awake() { cursor = GetComponent(); rope = GetComponent(); restLength = rope.restLength; } public void OnValidate() { // Make sure the range thresholds don't cross: outThreshold = Mathf.Max(inThreshold, outThreshold); } // Update is called once per frame void Update() { // get current and rest lengths: float length = rope.CalculateLength(); // calculate difference between current length and rest length: float diff = Mathf.Max(0, length - restLength); float lengthChange = 0; // if the rope has been stretched beyond the reel out threshold, increase its rest length: if (diff > outThreshold) lengthChange = outSpeed * Time.deltaTime; // if the rope is not stretched past the reel in threshold, decrease its rest length: if (diff < inThreshold) lengthChange = -inSpeed * Time.deltaTime; // make sure not to exceed maxLength: lengthChange -= Mathf.Max(0, restLength + lengthChange - maxLength); // set the new rest length: restLength = cursor.ChangeLength(lengthChange); } } }