using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(LineRenderer))] public class PhysicLineSegment : MonoBehaviour { public float segmentSpacing = 0.1f; public int k = 30; public Vector3 start; public Vector3 end; private List particles = new List(); private List sticks = new List(); private LineRenderer lineRenderer; private int segmentCount; public float gravity = -9.8f; public void Initialize(Vector3 start, Vector3 end) { this.start = start; this.end = end; //originalLength = Vector3.Distance(start, end); // Calculate the number of segments and the spacing between them segmentCount = Mathf.RoundToInt(Vector3.Distance(start, end) / segmentSpacing); lineRenderer = GetComponent(); // Initialize particles for (int i = 0; i < segmentCount; i++) { // Calculate the position of the segment var particle = new VerletParticle(Vector3.Lerp(start, end, i / (float)segmentCount)); particles.Add(particle); } // Initialize sticks for (int i = 0; i < segmentCount - 1; i++) { sticks.Add(new VerletStick(particles[i], particles[i + 1], segmentSpacing)); } // Lock the first particle particles[0].isLocked = true; lineRenderer.positionCount = segmentCount; } void FixedUpdate() { UpdateLine(); for (int i = 0; i < segmentCount; i++) { lineRenderer.SetPosition(i, particles[i].position); } } void UpdateLine() { // Apply gravity to particles for (int i = 1; i < particles.Count; i++) { particles[i].ApplyForce(Vector3.up * gravity * Time.deltaTime); particles[i].UpdatePosition(Time.deltaTime); } // Update sticks for (int ik = 0; ik < k; ik++) { foreach (var stick in sticks) { stick.UpdateStick(); } } } }