Created A Gravity Script for a solar system, in-game system contains 3 bodies, the Sun and 2 planets, the planets do not rotate around the Sun. In the inspector there are lots of adjustable variables. Changing the initial velocity of the objects does not cause them to orbit around the sun, but just cause them to move in the direction.
using UnityEngine;
using System.Collections.Generic;
public class GravitationalSystem : MonoBehaviour
{
public class CelestialBody
{
public GameObject gameObject;
public float mass;
public Vector3 velocity;
public Vector3 acceleration;
}
public GameObject[] celestialBodyPrefabs;
public float[] masses;
public Vector3[] initialPositions;
public Vector3[] initialVelocities;
private List<CelestialBody> bodies = new List<CelestialBody>();
private const float G = 6.67430e-11f; // Gravitational constant
private const float scaleFactor = 1e9f; // Scale factor to make distances manageable in Unity
void Start()
{
InitializeCelestialBodies();
}
void FixedUpdate()
{
CalculateGravitationalForces();
UpdatePositions();
}
void InitializeCelestialBodies()
{
for (int i = 0; i < celestialBodyPrefabs.Length; i++)
{
GameObject body = Instantiate(celestialBodyPrefabs[i], initialPositions[i] / scaleFactor, Quaternion.identity);
bodies.Add(new CelestialBody
{
gameObject = body,
mass = masses[i],
velocity = initialVelocities[i],
acceleration = Vector3.zero
});
}
}
void CalculateGravitationalForces()
{
for (int i = 0; i < bodies.Count; i++)
{
bodies[i].acceleration = Vector3.zero;
for (int j = 0; j < bodies.Count; j++)
{
if (i != j)
{
Vector3 direction = bodies[j].gameObject.transform.position - bodies[i].gameObject.transform.position;
float distance = direction.magnitude * scaleFactor;
float forceMagnitude = G * (bodies[i].mass * bodies[j].mass) / (distance * distance);
Vector3 force = forceMagnitude * direction.normalized;
bodies[i].acceleration += force / bodies[i].mass;
}
}
}
}
void UpdatePositions()
{
float dt = Time.fixedDeltaTime;
for (int i = 0; i < bodies.Count; i++)
{
// Update velocity (v = v0 + a * t)
bodies[i].velocity += bodies[i].acceleration * dt;
// Update position (x = x0 + v * t)
Vector3 newPosition = bodies[i].gameObject.transform.position + (bodies[i].velocity * dt) / scaleFactor;
bodies[i].gameObject.transform.position = newPosition;
}
}
}
Changing velocity makes the body move, but not affected by sun.
New contributor
user26236370 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.