# Need help applying gravity using C#

First off, I want to make clear that I do know you’re able to use rigidbody to create gravity, but I want to do it using C#, since I want to be a game developer one day, and i would like to learn some programming beforehand.

My game is still in it’s early stages, actually the only thing it currently has is a player (a simple box really) that can float around, and a floor which the player can’t interact with yet. Ow, And I almost forgot to mention that it is in fact a sidescroller game.

This is the coding i currently have:

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

//Player Handling
public int GroundSpeed = 12;
public int Gravity = 20;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

// Amount to Move
float MoveHorizontal = Input.GetAxis("Horizontal") * GroundSpeed * Time.deltaTime;

// Move the Player
transform.Translate(Vector2.right * MoveHorizontal);

// Apply gravity

}

}

If anyone knows a solution, please try to keep it simple, I am after all still a noob in programming.

• NoahKr

How to learn

One of many ways to implement gravity, use physics

https://docs.unity3d.com/Documentation/Manual/Physics.html

You’re already off to a good start. If you are after simple movement you can do something very similar to your horizontal movement:

transform.Translate(-Vector2.up * Gravity * Time.deltaTime);

So here you take Vector.up which is a normalised vector pointing down the positive Y or (0,1,0) - that is why we take the negative of it or (0,-1,0). Scaling to time means that we now move this object down at a rate of 20 units (20 metres) per second. You can wrap the gravity code in a check as to whether you are touching the ground - because you don’t want to fall when you are touching the ground.

// If we are NOT grounded, apply gravity
if(!IsGrounded)
{
transform.Translate(-Vector2.up * Gravity * Time.deltaTime);
}

You then need a collision to check for the floor. A simply check of the Y position can simulate a base floor but later more complex collisions will be needed. Here’s a brief example:

//Player Handling
public int GroundSpeed = 5;
public int Gravity = 1;
public bool IsGrounded = false;

// Update is called once per frame
void Update ()
{
// Amount to Move
float MoveHorizontal = Input.GetAxis("Horizontal") * GroundSpeed * Time.deltaTime;

// Move the Player
transform.Translate(Vector2.right * MoveHorizontal);

CheckForGround();

// If we are NOT grounded, apply gravity
if(!IsGrounded)
{
transform.Translate(-Vector2.up * Gravity * Time.deltaTime);
}
}

void CheckForGround()
{
if(transform.position.y < 0)
{
// Cache the position
Vector3 position = transform.position;
// Set Y component to floor level
position.y = 0;
// Assign new position
transform.position = position;
}
}

In this example the floor is at 0 in the Y, set the two 0’s to your floor’s Y position. I hope this is enough to get you started. And hope it wasn’t too much/fast.

This implementation gives a constant falling/movement speed. Ideally, you would store a velocity vector and apply acceleration/deceleration to it so that velocity can change over more than one frame.