Making a character fly

Hi guys,
I’m developing a 2D platformer with Unity in which the main character can fly by keeping the up button pressed. However, I can’t find a way to make him fly-- rather, he simply does multiple jumps in mid-air (like in a Kirby game).
How can I fix this and make him fly?
Here’s the code I used:

[RequireComponent (typeof (Controller2D))]
public class Player : MonoBehaviour {
   
    public float jumpHeight = 4;
    public float timeToJumpApex = .4f;
    public float accelerationTime = .1f;
    public float moveSpeed = 6;
    float gasTank = 0; // if the gasTank variable is 0 the player can't fly anymore
   
    float gravity;
    float jumpVelocity;
    Vector3 velocity;
    float velocityXSmoothing;
    float velocityYSmoothing;

    Controller2D controller;
   
    void Start () {
        controller = GetComponent <Controller2D> ();
        gravity = -(2 * jumpHeight) / Mathf.Pow (timeToJumpApex, 2);
        jumpVelocity = Mathf.Abs(gravity) * timeToJumpApex;

    }
   
    void Update () {
        // if player is touching either ground or ceiling
        if (controller.collisions.above || controller.collisions.below)
            velocity.y = 0;

        // if player is touching only ground
        if (controller.collisions.below)
            gasTank = 14;

        // if player presses up button the GasTank variable goes down to 0
        else if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            if (gasTank > 0)
            gasTank -= 0.1f;
            else
            gasTank -= 0f;
        }

        Vector2 input = new Vector2 (Input.GetAxisRaw ("Horizontal"), Input.GetAxisRaw ("Vertical"));
        if (Input.GetKeyDown(KeyCode.UpArrow) && gasTank > 0){
                velocity.y += jumpVelocity;
        }
        else
            velocity.y = velocity.y;

        float targetVelocityX = input.x * moveSpeed;
        float targetVelocityY = input.y * moveSpeed;
        velocity.x = Mathf.SmoothDamp (velocity.x, targetVelocityX, ref velocityXSmoothing, accelerationTime);
        velocity.y += gravity * Time.deltaTime;
        controller.Move (velocity * Time.deltaTime);

        print ("Gravity: " + gravity + " jumpVelocity: " + jumpVelocity + " gasTank: " + gasTank + " velocity.y: " + velocity.y);
    }
}

You can try using Input.GetKey instead of Input.GetKeyDown to get a continuous input for flight.

Input.GetKeyDown would only trigger each time the key is pressed while Input.GetKey would trigger whenever the key is held.

1 Like