The reason why your isGrounded is always false, is because you are checking it before you apply gravity, it is therefore not grounded at that point. Then you apply gravity and it becomes grounded. Whenever using the character controller, you should also never call . Move more than once per frame