using UnityEngine; using System.Collections.Generic; using Unity.VisualScripting; using UnityEditor.Callbacks; using System; using UnityEditor; using System.Linq; public class PlayerOrbits : MonoBehaviour { public List planets; public float forceX; public float forceY; bool inPlanet = false; public float velocity; Stopwatch stopwatch; public float dampening; public float farDist; public float midDist; public float closeDist; public float farMod; public float midMod; public float closeMod; public Pause paused; public Vector2 storedVelocity; public Transform lastPlanetHit; Rigidbody2D rb; bool once; private bool isOutOfBounds = false; public float dampingAmount = 0.993f; private void Start() { once = false; rb = gameObject.GetComponent(); stopwatch = GameObject.FindGameObjectWithTag("Manager").GetComponent(); } void Update() { if (!paused.pause) { once = true; if (storedVelocity != new Vector2(0, 0)) { rb.linearVelocity = storedVelocity; storedVelocity = new Vector2(0, 0); } forceX = 0; forceY = 0; foreach (Draggable p in planets) { float distanceModifier = CalculateDistance(transform.position, p.gameObject.transform.position, p); float distX = p.gameObject.transform.position.x - transform.position.x; float distY = p.gameObject.transform.position.y - transform.position.y; //i fucked around here bc i was tryna do something. it did not work :skull: forceX += p.intensity * dampening * distanceModifier * (distX / MathF.Sqrt(distX * distX + distY * distY)); forceY += p.intensity * dampening * distanceModifier * (distY / MathF.Sqrt(distX * distX + distY * distY)); } //bounce check if (inPlanet && lastPlanetHit != null) { Vector2 planetToShip = rb.position - (Vector2)lastPlanetHit.position; Vector2 normal = planetToShip.normalized; Vector2 incomingVelocity = rb.linearVelocity; Vector2 reflectedVelocity = Vector2.Reflect(incomingVelocity, normal); rb.linearVelocity = reflectedVelocity + new Vector2(forceX, forceY); inPlanet = false; lastPlanetHit = null; } else { rb.linearVelocity = new Vector2(rb.linearVelocityX + forceX, rb.linearVelocityY + forceY); } if (isOutOfBounds) { rb.linearVelocity *= dampingAmount; } velocity = Mathf.Abs(rb.linearVelocityX + forceX) + Mathf.Abs(rb.linearVelocityY + forceY) * 100; if (rb.linearVelocity != Vector2.zero) { float angle = Mathf.Atan2(rb.linearVelocity.y, rb.linearVelocity.x) * Mathf.Rad2Deg; transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward); } } else { if (once == true) { storedVelocity = rb.linearVelocity; rb.linearVelocity = new Vector2(0, 0); once = false; } } } public float CalculateDistance(Vector2 a, Vector2 b, Draggable p) { float distance = Mathf.Sqrt(Mathf.Pow(b.x - a.x, 2) + Mathf.Pow(b.y - a.y, 2)); float distance1 = Mathf.Abs(distance - farDist * p.size); float distance2 = Mathf.Abs(distance - midDist * p.size); float distance3 = Mathf.Abs(distance - closeDist * p.size); //if too far away don't apply force if (distance > p.size) { return 0; } else if (distance1 < distance2 && distance1 < distance3) { return farMod; } else if (distance2 < distance1 && distance2 < distance3) { return midMod; } else { return closeMod; } } private void OnTriggerEnter2D(Collider2D collision) { //using path to detect if on road is easier than making the borders align up. //when actually putting in levels, we may want to build it off of tons of rectangles. if (collision.gameObject.tag == "Path") { isOutOfBounds = false; } if (collision.gameObject.tag == "Bounds1") { isOutOfBounds = true; } //check if in planet for bounce if (collision.gameObject.tag == "Planet" && stopwatch.timeRun && !Draggable.isDraggingGlobal) { inPlanet = true; lastPlanetHit = collision.transform; } } private void OnTriggerExit2D(Collider2D collision) { if (collision.gameObject.tag == "Path") { isOutOfBounds = true; } if (collision.gameObject.tag == "Bounds1") { isOutOfBounds = false; } } }