The Godot Q&A is currently undergoing maintenance!

Your ability to ask and answer questions is temporarily disabled. You can browse existing threads in read-only mode.

We are working on bringing this community platform back to its full functionality, stay tuned for updates.

godotengine.org | Twitter

+1 vote

Hello!
I created a 3D character using kinematic body(3D) . Now i want to make my character jump and then fall on the ground(gravity). See the code

extends KinematicBody

var velocity = Vector3.ZERO
var gravity = 100
func _physics_process(delta):
    if Input.is_action_ just_pressed("jump"):
        velocity.y = 10
        velocity.y += gravity *delta
        move_and_slide(velocity)

with this code my player jumps but it does not fall back instead it gets stucked in the middle.Now i want to know how to add gravity -

in Engine by (37 points)

1 Answer

+4 votes

What you see happens because you are only adding gravity when you jumped, so the gravity is not added when already on air. Also, move and slide is only being called inside the if where you jump... try something like this:

extends KinematicBody

var velocity = Vector3.ZERO
var gravity = 100
func _physics_process(delta):
    if Input.is_action_ just_pressed("jump") and is_on_floor():
        velocity.y = 10

    velocity.y += gravity *delta
    velocity = move_and_slide(velocity, Vector3.UP)

Note that i moved the last two lines outside the if, and also, added a check to see if the body is on floor before jumping, to avoid jumping in middle air. Also, you should update velocity with move_and_slide so gravity doesnt sum up while on floor.

Edited as people in comments noted it was missing up direction

by (3,505 points)
edited by

hello!
thanks for your answer but now it is going upward without any Input press and it is not stopping.

Thanks!
I have figured out this problem . Thank you for solution

Yiu are welcome! If the answer worked for you, you may select it so others can see its solved!

you forgot to add:

velocity = move_and_slide(velocity, Vector3.UP)

isonfloor() will always return false if the up direction isnt specified

p7f
your answer was incomplete but the technique gave me an idea

chevon
yes i applied this code and it worked

Oh, yeah, i forgot that. I just modified the original code in the original question.

your answer was incomplete but the technique gave me an idea

Ok, glad to help! So it would be nice for you to post your solution, and select that answer, so others can see its solved!

i am trying to learn godot and had the same question.
the only thing i changed from your code was instead of += i used -=

so the final code looks like this.

thank you.

extends KinematicBody

var velocity = Vector3.ZERO
var gravity = 30

func _ready():
    pass

func _physics_process(delta):
    velocity.y -= gravity * delta
    velocity = move_and_slide(velocity,Vector3.UP)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.