Character Controller Not Allowing Gravity

I’ve added a character controller to a capsule and even though it has a rigidbody attached, it won’t use gravity and fall to the floor. As soon as I disable it though, it does. I even tried making artificial gravity through scripting (the script uses flags to detect whether or not the player is touching the floor):

Vector3 moveDir = Vector3.zero;

void Update () {
    moveDir.y -= gravity * Time.deltaTime;
    var flags = controller.Move(moveDir * Time.deltaTime);
    grounded = ((flags & CollisionFlags.CollidedBelow) != 0);
}

(‘controller’ being the CharacterController)

That didn’t even work. Why is this happening?

Edit

Here’s the whole movement script:

    public float speed = 10;
 public float rotationSpeed = 2;

 private bool canRun = true;
 public float runSpeed = 15;
 public bool running;

 private bool canCrawl = true;
 public float crawlSpeed = 5;
 public bool crawling;
 public float standUpTime = 3;
 public float crawlHeight;
 private float normalHeight;
 private Vector3 tempCent;

 private bool canJump = true;
 public float jumpHeight = 5;
 public bool jumping;

 public float gravity = 1;

 private Vector3 moveDir;
 private Vector3 rotDir;
 private float moveHor;

 private CharacterController controller;
 private PlayerStats playerStats;
 private Transform player;

 void Awake () {

 player = transform;
 controller = player.GetComponent<CharacterController>();
 playerStats = player.GetComponent<PlayerStats>();
 normalHeight = controller.height;
 tempCent.y = controller.center.y/2;
 }

 void Update () {

 bool isControllable = playerStats.isControllable;
 moveDir.y -= gravity * Time.deltaTime;

 if(!isControllable){
 Input.ResetInputAxes();
 }else{
 if(controller.isGrounded){
 moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
 moveDir = player.TransformDirection(moveDir);
 moveDir *= speed;

 moveHor = Input.GetAxis("Horizontal");
 
 if(!crawling && !jumping){
 canRun = playerStats.canRun;
 running = playerStats.canRun;
 }
 canJump = playerStats.energy > 0;

 if(moveHor > 0){
 rotDir = new Vector3(0, 1, 0);
 }else if(moveHor < 0){
 rotDir = new Vector3(0, -1, 0);
 }else{
 rotDir = new Vector3(0, 0, 0);
 }

 if(Input.GetButton("Jump")){
 if(canJump){
 moveDir.y = jumpHeight;
 canRun = false;
 canCrawl = false;
 controller.height = normalHeight;
 controller.center = tempCent;
 }
 }

 if(Input.GetKey(KeyCode.LeftShift)){
 if(canRun){
 moveDir *= runSpeed;
 canCrawl = false;
 running = true;
 }
 if(crawling){
 animation.Play("GetUp");
 canRun = true;
 crawling = false;
 controller.height = normalHeight;
 controller.center = tempCent;
 } 
 }else{
 running = false;
 }

 if(Input.GetKey("c")){
 if(canCrawl){
 moveDir *= crawlSpeed;
 controller.height = crawlHeight;
 tempCent.y -= 0.25F;
 controller.center = tempCent;
 canRun = false;
 canJump = false;
 crawling = true;
 }
 }else{
 crawling = false;
 }
 controller.Move(moveDir * Time.deltaTime);
 controller.transform.Rotate(rotDir * Time.deltaTime, rotationSpeed);
 }
 moveDir.y -= gravity * Time.deltaTime;
 }
 }
}

You can’t mix Rigidbody and CharacterController in the same object - the object becomes crazy! You must use only one of them. The CharacterController is easier: it already has a isGrounded property, and you can start with one of the example scripts in SimpleMove (rotates with AD, moves with WS, has automatic gravity but can’t jump or fly) or 2 (moves with WASD, can jump, gravity is added by script) and modify it to suit your needs.

The Rigidbody is too wild, but can be controlled in a SimpleMove fashion with a simple script like this:

var speed : float = 3.0;
var rotateSpeed : float = 3.0;

function Start(){
    rigidbody.freezeRotation = true;
}

function Update () {
    // Rotate around y - axis
    transform.Rotate(0, Input.GetAxis ("Horizontal") * rotateSpeed, 0);
    // Calculate forward/backward velocity:
    var moveVel = transform.forward * speed * Input.GetAxis ("Vertical");
    moveVel.y = rigidbody.velocity.y; // but conserve gravity effect
    rigidbody.velocity = moveVel;
}

moveDir.y -= gravity * Time.deltaTime;

 if(!isControllable)
 {
      Input.ResetInputAxes();
 }
else
{
     if(controller.isGrounded)
     {
          moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));

Perhaps try applying gravity after you set the moveDirection.

Alright I think I got it.
Lets just take out te content of that if statement and…

void Update()
{
    bool isControllable = true;
    moveDir.y -= gravity * Time.deltaTime;

    if (!isControllable)
    {
        Input.ResetInputAxes();
    }
    else
    {
        if (controller.isGrounded)
        {
            //Omitted To Demonstrate the lol
        }
        moveDir.y -= gravity * Time.deltaTime;
    }
}

Something be missing, lad…

I added an else and applied the movement to the Move, and it worked. Good Luck, and Have Fun!

Its very simple. You may have noticed Gravity working every time your player moves. When character controller is triggered , gravity works. that’s what we need to do without moving character!

  var controller : CharacterController = GetComponent(CharacterController);
    controller.SimpleMove(Vector3.forward * 0);

its JS.