I’m sure you’ve seen a game where a planet with its own gravity was used. In fact, this effect is actually simpler than you probably think. So how to do it?
STEP 1 – Create a planet
The first thing we should do is to create a planet that will attract our objects. Don’t forget to add Circle Collider 2D to keep the objects from falling through the planet. The object that will be attracted should have a Box Collider 2D and Rigidbody 2D component, in which we set the Gravity Scale value to zero.

STEP 2 – Measure the distance between the object and the planet
If you want gravity to take effect only from a given distance, we need to measure the distance between the planet and the object. Therefore, we need to declare the variable public GameObject planet;
to know where the planet is. The Vector3.Distance(a, b);
command will allow us to find the distance between the objects, so the code should look like this:
using UnityEngine;
public class PlanetGravity : MonoBehaviour
{
public GameObject planet;
void Update()
{
float dist = Vector3.Distance(planet.transform.position, transform.position);
}
}
STEP 3 – Programming of gravity
Now the most important part – How to program gravity to the center of the planet? Before we can answer this question, we first need to declare the variables public float gravityDistance;
, public float gravityForce;
and Rigidbody2D rb;
. We need to find out which direction the center of the planet is located, so we use the planet.transform.position - transform.position;
command to do this. Finally, we just need to use the command Rigidbody2D.AddForce();
to create a so-called false gravity. This is what the code looks like:
// Insert the final code into each object you want the planet to attract.
using UnityEngine;
public class PlanetGravity : MonoBehaviour
{
Rigidbody2D rb;
public float gravityDistance = 150.0f;
public float gravityForce = 50.0f;
public GameObject planet;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// Distance to the planet
float dist = Vector3.Distance(planet.transform.position, transform.position);
Vector3 v = planet.transform.position - transform.position;
// Gravity
rb.AddForce(v.normalized * (1.0f - dist / gravityDistance) * gravityForce);
}
}
