Gravity with Character Controller?

How can I give the player gravity with a character controller? I tried using transform.translate as well as charactercontroller.move, but they don’t seem like the best methods.

The CharacterController must be moved only with Move or SimpleMove. SimpleMove applies gravity automatically, but you can’t control the vertical movement (no fly, no jump).

The parameters passed to each function are different: SimpleMove receives the desired velocity vector (Y is ignored), while Move receives the displacement since last frame.

SimpleMove can be used like this:

var speed: float = 5; // units per second
var turnSpeed: float = 90; // degrees per second

function Update(){
  transform.Rotate(0, Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime, 0);
  var vel: Vector3 = transform.forward * Input.GetAxis("Vertical") * speed;
  var controller = GetComponent(CharacterController);
  controller.SimpleMove(vel);
}

Move receives the displacement since last frame, what is simply the desired velocity multiplied by the ubiquitous Time.deltaTime - but remember to include the gravity in the vertical velocity:

var speed: float = 5; // units per second
var turnSpeed: float = 90; // degrees per second
var jumpSpeed: float = 8;
var gravity: float = 9.8;
private var vSpeed: float = 0; // current vertical velocity

function Update(){
  transform.Rotate(0, Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime, 0);
  var vel: Vector3 = transform.forward * Input.GetAxis("Vertical") * speed;
  var controller = GetComponent(CharacterController);
  if (controller.isGrounded){
    vSpeed = 0; // grounded character has vSpeed = 0...
    if (Input.GetKeyDown("space")){ // unless it jumps:
      vSpeed = jumpSpeed;
    }
  }
  // apply gravity acceleration to vertical speed:
  vSpeed -= gravity * Time.deltaTime;
  vel.y = vSpeed; // include vertical speed in vel
  // convert vel to displacement and Move the character:
  controller.Move(vel * Time.deltaTime);
}

Notice that vSpeed is a member variable (declared outside any function): it stores the current vertical speed, what is necessary to produce physically correct effects when jumping or falling - the vertical velocity grows downwards while in mid air due to the gravity, like in the real world.

Like, every CharacterController script tutorial already does this.

var gravity : float;
...
gravity -= 9.81 * Time.deltaTime;
controller.Move( Vector3(x, gravity, z) );
if ( controller.isGrounded ) gravity = 0;

THE BEST METHOD IS TO ACTIVATE CHARACTER CONTROLLER

  var controller : CharacterController = GetComponent(CharacterController);

 controller.SimpleMove(Vector3 .forward  * 0);

AND GRAVITY WORKS

Dude.

public CharacterController cc;
float vv;
float g = 14.0f;
float jf = 10.0f;
float s = 8.0f;
void Start () {
	if (gameObject.GetComponent<CharacterController> () != null) {
		cc = GetComponent<CharacterController> ();
	} else {
		gameObject.AddComponent<CharacterController> ();
		cc = GetComponent<CharacterController> ();
	};
}

void Update () {
	cc.enabled = true;
	if (Input.GetKey (KeyCode.Z)) {
		s = 16.0f;
	} else {
		s = 8.0f;
	};
	if (cc.isGrounded) {
		vv = -g * Time.deltaTime;
			if (Input.GetKeyDown(KeyCode.X)) {
			vv = jf;
		};
	} else {
		vv -= g * Time.deltaTime;
	};
	Vector3 mv = new Vector3 (Input.GetAxis("Horizontal")*s,0,Input.GetAxis("Vertical")*s);
	cc.Move (mv * Time.deltaTime);
}

}