using System; using UnityEngine; [RequireComponent(typeof(LineRenderer))] [ExecuteInEditMode] public class Cable_Procedural_Simple : MonoBehaviour { private LineRenderer line; [SerializeField] private Transform endPointTransform; [SerializeField] private int pointsInLineRenderer = 5; [SerializeField] private float sagAmplitude = 1f; [SerializeField] private float swayMultiplier = 1f; [SerializeField] private float swayXMultiplier = 1f; [SerializeField] private float swayYMultiplier = 0.5f; [SerializeField] private float swayFrequency = 1f; private Vector3 vectorFromStartToEnd; private Vector3 sagDirection; private float swayValue; private void Start() { line = GetComponent(); line.positionCount = pointsInLineRenderer; sagDirection = Physics.gravity.normalized; swayValue = UnityEngine.Random.Range(0f, 3.14f); } private void Update() { Animate(); } private void Animate() { if (!endPointTransform) { Debug.LogError("No Endpoint Transform assigned to Cable_Procedural component attached to " + base.gameObject.name); } else { vectorFromStartToEnd = endPointTransform.position - base.transform.position; base.transform.forward = vectorFromStartToEnd.normalized; } int i = 0; swayValue += swayFrequency * Time.deltaTime; if (swayValue > MathF.PI * 2f) { swayValue = 0f; } if (swayValue < 0f) { swayValue = MathF.PI * 2f; } for (; i < pointsInLineRenderer; i++) { float num = (float)i / (float)(pointsInLineRenderer - 1); float num2 = Mathf.Sin(num * MathF.PI); Vector3 vector = vectorFromStartToEnd * num; Vector3 vector2 = sagDirection * sagAmplitude; Vector3 vector3 = swayMultiplier * base.transform.TransformDirection(new Vector3(Mathf.Sin(swayValue) * swayXMultiplier, Mathf.Cos(2f * swayValue + MathF.PI) * 0.5f * swayYMultiplier, 0f)); Vector3 position = base.transform.position + vector + (vector3 + Vector3.ClampMagnitude(vector2, sagAmplitude)) * num2; line.SetPosition(i, position); } } }