- Home /
How to make 2d movement in air but not on ground?
I am attempting to create a 2d sprite game where a mechanic is only been allowed to move when in the air and be immobilised on the ground. Here is my script so far:
public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = Vector3.zero;
void Update() {
CharacterController controller = GetComponent<CharacterController>();
// is the controller on the ground?
if (controller.isGrounded) {
//Feed moveDirection with input.
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
//Multiply it by speed.
moveDirection *= speed;
//Jumping
if (Input.GetButton("Jump"))
moveDirection.y = jumpSpeed;
}
//Applying gravity to the controller
moveDirection.y -= gravity * Time.deltaTime;
//Making the character move
controller.Move(moveDirection * Time.deltaTime);
}
}
This immobilises movement on ground and allows me to jump but it won't let me move whilst in the air can someone explain to me how to edit my script so it allows movement in the air but keeps them still on the ground?
Answer by KellyThomas · Jan 21, 2014 at 10:45 PM
It looks like you are only processing player input while the character is on the ground:
if (controller.isGrounded) {
//Feed moveDirection with input.
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
// ...
}
If you want them control movement while in the air you will have to build logic that handles that circumstance.
There are many ways to create such logic, but this is the way I personally find most useful: $$anonymous$$ake a small cube underneath the controller, sticking down just a little past the controller. $$anonymous$$ake it a trigger and a child of your controller. Put a script on the cube and have OnTriggerEnter() increase a counter by one. Have OnTriggerExit() decrease that counter. In your controller, you can now reference that cube. As long as that counter is 0 it means you're in the air, if it is positive you're grounded. The reason for the counter is in the situation that it is standing right in between multiple objects.
Other options, depending on the level design and complexity required in the game, could include: Shooting a ray downwards and seeing if anything is close enough. Shooting a spherecast or capsulecst downwards just like a ray. If you don't want him to move when butted up against a wall, you could use OnCollisionEnter or OnCollisionStay.