RBalconi
RBalconi

Reputation: 47

Delay before jump

I'm learning Unity, and I'm doing a character move, but the animation of the jump has a delay for the character to literally jump, a 0.30s until it picks up, how do I add this delay in the code?

Like, I thought of doing somehow that when you hit "Space" release the animation, count 0.20s and make the jump. it's viable? How can I do this?

In short, the character jumps before the animation.

Animation Video: https://i.sstatic.net/u7yLF.jpg

public class PlayerController : MonoBehaviour {

    public float moveSpeed;
    public float jumpForce;
    public CharacterController controller;

    private Vector3 moveDirection;
    public float gravityScale;

    public Animator animator;

    void Start() {
        controller = GetComponent<CharacterController>();
    }

    void Update() {
        float yStore = moveDirection.y;
        moveDirection = (transform.forward * Input.GetAxis("Vertical")) + (transform.right * Input.GetAxis("Horizontal"));
        moveDirection = moveDirection.normalized * moveSpeed;
        moveDirection.y = yStore;

        jump();

        controller.Move(moveDirection * Time.deltaTime);
        animator.SetFloat("Speed", (Mathf.Abs(Input.GetAxis("Vertical"))));

    }

    void jump() {
        if (controller.isGrounded) {
            moveDirection.y = 0f;
            if (Input.GetButtonDown("Jump")) {
                moveDirection.y = jumpForce;
                Debug.Log("jump");
            }
        }
        moveDirection.y = moveDirection.y + (Physics.gravity.y * gravityScale * Time.deltaTime);
        animator.SetBool("isGrounded", controller.isGrounded);
    }
}

Upvotes: 0

Views: 829

Answers (2)

LiefLayer
LiefLayer

Reputation: 1073

To what One Man Mokey Squad suggest I think you should also consider to get a new jump animation or trim the current animation. I think it's not a great idea to create a custom code for that broken jump animation because you will not be able to reuse your script.

Upvotes: 0

One Man Monkey Squad
One Man Monkey Squad

Reputation: 403

In your jump() function don't apply the jump force. Instead, set the next time the character is supposed to jump.

float nextJumpTime;
bool todoJump;
void jump() {
    if (!todoJump && Input.GetButtonDown("Jump")) {
        // Remember we have to jump and when
        nextJumpTime = Time.time + 0.2f;
        todoJump = true;
    }
    // Execute the jump
    if (todoJump && Time.time >= nextJumpTime) {
        todoJump = false;
        moveDirection.y = jumpForce;
    }
}

Either that or read on coroutines. Start a coroutine on input, yield return new WaitForSecond(0.2f); in the coroutine and then execute the jump.

Upvotes: 2

Related Questions