Unity 2D Change Gravity | Unity Tutorial
Learn how to dynamically change gravity directions in Unity 2D and manage movement constraints with a single script. This quick tutorial will show you how to set up gravity to affect your game objects in any direction and automatically freeze movement along the perpendicular axis. Perfect for enhancing gameplay mechanics or adding unique physics effects!
WATCH FULL TUTORIAL ON YOUTUBE
=========================================================
Unity Projects - ON SALE!!!
1. Water Sort Puzzle 9000 Levels
2. Ball Sort Puzzle 9000 Levels
3. Sling Shot
=========================================================
Script:
GravityController.cs
using UnityEngine;
public class GravityController : MonoBehaviour
{
// Enum to define the possible gravity directions
public enum GravityDirection
{
PositiveX,
NegativeX,
PositiveY,
NegativeY
}
// Public variables to set the gravity direction and value in the Inspector
public GravityDirection gravityDirection = GravityDirection.NegativeY; // Default direction
public float gravityValue = 2f; // Magnitude of gravity
private Rigidbody2D rb2d;
void Start()
{
// Get the Rigidbody2D component
rb2d = GetComponent<Rigidbody2D>();
if (rb2d == null)
{
Debug.LogError("Rigidbody2D component is missing from this GameObject.");
return;
}
// Initialize gravity and constraints
UpdateGravityAndConstraints();
}
void Update()
{
// Update gravity and constraints if the direction or value changes
UpdateGravityAndConstraints();
}
void UpdateGravityAndConstraints()
{
// Determine the direction of gravity based on gravityDirection
Vector2 gravity = Vector2.zero;
RigidbodyConstraints2D constraints = RigidbodyConstraints2D.None;
switch (gravityDirection)
{
case GravityDirection.PositiveX:
gravity = new Vector2(gravityValue, 0);
constraints = RigidbodyConstraints2D.FreezePositionY | RigidbodyConstraints2D.FreezeRotation;
break;
case GravityDirection.NegativeX:
gravity = new Vector2(-gravityValue, 0);
constraints = RigidbodyConstraints2D.FreezePositionY | RigidbodyConstraints2D.FreezeRotation;
break;
case GravityDirection.PositiveY:
gravity = new Vector2(0, gravityValue);
constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;
break;
case GravityDirection.NegativeY:
gravity = new Vector2(0, -gravityValue);
constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezeRotation;
break;
}
// Apply the new gravity direction and constraints to the Physics2D settings and Rigidbody2D
Physics2D.gravity = gravity;
rb2d.constraints = constraints;
}
}