- Home /
Can't control movement while jumping
I'm very new to Unity and I've been trying to learn it all day but I can't seem to get my character to move while he's in the air. I'm trying to make a simple 3D platformer, simpler than the tutorial one in the asset store so I don't want to use that as a reference.
I know the isGrounded statement is in there but when i take that out or seperate it so it tests for when the controller is not grounded, the jumping turns into a small hop and slowly falls down.
var speed : float = 6.0;
var jumpSpeed : float = 8.0;
var gravity : float = 20.0;
private var moveDirection : Vector3 = Vector3.zero;
function Update() {
var controller : CharacterController = GetComponent(CharacterController);
if (controller.isGrounded) {
// We are grounded, so recalculate
// move direction directly from axes
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
}
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime;
// Move the controller
controller.Move(moveDirection * Time.deltaTime);
}
Actually, the isGrounded statement does not affect movement. It just prevents the player from jumping again while in the air.
Answer by LunaArgenteus · Mar 04, 2013 at 11:11 PM
Start by moving these lines:
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
to just above your check to see if the controller is grounded. This will allow moveDirection to be affected by your horizontal input regardless of whether you are grounded or not.
However, you'll also need to add a variable to keep track of the Y velocity as you adjust your move direction - in the code you've posted, since you can't move in the air, it's not an issue that you set the Y component of moveDirection to 0 every update that you're on the ground, but you don't want to be resetting your Y velocity to 0 every update.
Something like what's below should do the trick.
var yVel : float = moveDirection.y;
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
moveDirection += (Vector3.up * yVel);
Still won't work. I can get it to move in the air if I separate the isGrounded movement with one in an "else" statement so it can move in the air but can't jump, but it will always set the y position to 0 ins$$anonymous$$d of making it jump.
function Update() {
var controller : CharacterController = GetComponent(CharacterController);
if (controller.isGrounded) {
// We are grounded, so recalculate
// move direction directly from axes
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
}
else
{
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
}
The reason for that is explained in the second part of my answer: you're resetting the Y component of moveDirection to zero (no vertical movement) when you set the movementDirection. To get around this, you NEED to set up an extra variable to keep track of the y component before you reset it (an example of which is also in my original answer). Also, you don't need an if else if you are executing the same code in both cases - just move the common code to before the if statement, much like kramcomposer below has done.
Thank you, for some reason it didn't work before lol. The help is much appreciated
Your answer
Follow this Question
Related Questions
How do I create variable Jump Height for a platformer? 1 Answer
How to check if object is on ground (C#)? 1 Answer
isGrounded is always false, even with gravity, how do you fix that? 1 Answer
Character on a moving platform slows down 1 Answer
Player Character looses jump height the further right they go 1 Answer