aboutsummaryrefslogtreecommitdiffstats
path: root/Assets/Scripts/RopePrototype.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/RopePrototype.cs')
-rw-r--r--Assets/Scripts/RopePrototype.cs133
1 files changed, 0 insertions, 133 deletions
diff --git a/Assets/Scripts/RopePrototype.cs b/Assets/Scripts/RopePrototype.cs
deleted file mode 100644
index b2f37ab..0000000
--- a/Assets/Scripts/RopePrototype.cs
+++ /dev/null
@@ -1,133 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-
-public class RopePrototype : MonoBehaviour
-{
- public int constraintIterations = 50;
- public float gravityMultiplier = 1.0f;
- public float lineWidth = 0.1f;
- public float ropeSegmentLength = 0.25f;
- public int segmentCount = 35;
-
- LineRenderer lr;
- DistanceJoint2D dj;
- GameObject player;
- List<RopeSegment> ropeSegments = new List<RopeSegment>();
- Vector3[] ropePositions;
- bool ropeCreated = false;
-
- // Start is called before the first frame update
- void Start()
- {
- player = GameObject.FindGameObjectWithTag("Player");
- dj = GetComponent<DistanceJoint2D>();
- lr = GetComponent<LineRenderer>();
- lr.startWidth = lineWidth;
- lr.endWidth = lineWidth;
- ropePositions = new Vector3[segmentCount];
- lr.positionCount = segmentCount;
- Vector2 ropeLoc = transform.position;
-
- for (int i = 0; i < segmentCount; i++)
- {
- ropeSegments.Add(new RopeSegment(ropeLoc));
- ropeLoc.y -= ropeSegmentLength;
- }
- }
-
- // Update is called once per frame
- void Update()
- {
- if (!ropeCreated)
- {
- CreateRope();
- ropeCreated = true;
- }
- RenderLine();
- Simulate();
- }
-
- void RenderLine()
- {
- for(int i = 0; i < ropePositions.Length; i++)
- {
- ropePositions[i] = ropeSegments[i].posNow;
- }
- lr.SetPositions(ropePositions);
- }
-
- void CreateRope()
- {
- dj.connectedBody = player.GetComponent<Rigidbody2D>();
- dj.maxDistanceOnly = true;
- dj.distance = Vector2.Distance(player.transform.position, transform.position);
- }
-
- void Simulate()
- {
- Vector2 gravityForce = new Vector2(0f, -gravityMultiplier);
-
- for(int i = 0; i < ropeSegments.Count; i++)
- {
- RopeSegment segment = ropeSegments[i];
- Vector2 velocity = segment.posNow - segment.posOld;
- segment.posOld = segment.posNow;
- segment.posNow += velocity;
- segment.posNow += gravityForce * Time.deltaTime;
- ropeSegments[i] = segment;
- }
-
- for(int i = 0; i < constraintIterations; i++)
- {
- ApplyContraint();
- }
- }
-
- void ApplyContraint()
- {
- RopeSegment endSegment1 = ropeSegments[0];
- endSegment1.posNow = transform.position;
- ropeSegments[0] = endSegment1;
-
- RopeSegment endSegment2 = ropeSegments[ropeSegments.Count - 1];
- endSegment2.posNow = player.transform.position;
- ropeSegments[ropeSegments.Count - 1] = endSegment2;
-
- for (int i = 0; i < ropeSegments.Count-1; i++)
- {
- RopeSegment segment1 = ropeSegments[i];
- RopeSegment segment2 = ropeSegments[i + 1];
-
- float distance = (segment1.posNow - segment2.posNow).magnitude;
- float error = distance - ropeSegmentLength;
- Vector2 normalChange = (segment1.posNow - segment2.posNow).normalized;
- Vector2 change = normalChange * error;
-
- if(i != 0)
- {
- segment1.posNow -= change * 0.5f;
- ropeSegments[i] = segment1;
- segment2.posNow += change * 0.5f;
- ropeSegments[i + 1] = segment2;
- }
- else
- {
- segment2.posNow += change;
- ropeSegments[i + 1] = segment2;
- }
- }
- }
-
- public struct RopeSegment
- {
- public Vector2 posNow;
- public Vector2 posOld;
-
- public RopeSegment(Vector2 pos)
- {
- this.posNow = pos;
- this.posOld = pos;
- }
- }
-}