using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Rigidbody2D))] public class Gravitation : MonoBehaviour { [Header("Forces")] protected Vector3 appliedForce; protected float forcesIntensity; [Header("Internals")] public static List simulatedObjects; public int positionInList; [Header("References")] protected new Rigidbody2D rigidbody; protected GameController gameController; protected float mass { get { return rigidbody.mass; } set { rigidbody.mass = value; } } private void Awake() { if(simulatedObjects == null) { simulatedObjects = new List(); } positionInList = simulatedObjects.Count; simulatedObjects.Add(this); } private void Start() { rigidbody = GetComponent(); gameController = GameObject.Find("GameController").GetComponent(); appliedForce = new Vector3(0f, 0f, 0f); forcesIntensity = 0f; } // O(n²) private void FixedUpdate() { foreach(Gravitation other in simulatedObjects) { if(other.positionInList <= this.positionInList) continue; float distance = Vector3.Distance(this.transform.position, other.transform.position); float force = gameController.gravitationConstant * this.mass * other.mass / Mathf.Pow(distance, 2); Vector3 direction = (other.transform.position - this.transform.position).normalized; this.appliedForce += direction * force; this.forcesIntensity += force; other.appliedForce -= direction * force; other.forcesIntensity += force; } rigidbody.AddForce(appliedForce); if(forcesIntensity >= 5f) { GetComponent().color = Color.yellow; } appliedForce = new Vector3(0, 0, 0); forcesIntensity = 0f; } }