extends RayCast3D @export_range(0.0, 3.0) var float_height := 1.5 @export_range(0.0, 2.0) var bounce_dist := 0.5 @export_range(0.0, 2.0) var bounce_speed := 0.4 @export_range(0.0, 4.0) var spin_speed := 0.5 @export var curve: Curve var start_height = 0.0 var dest_height = 0.0 var t = 0.0 func _ready(): start_height = position.y #raycast downwards and position the item at a set height above the ground that the raycast #presumably hits #Now I know what you're thinking: "if the item is placed on the ground in the editor anyway, we can put #the item at the correct height by simply adding the height to the existing y value that the item will have #anyway when the game starts" but what you're not considering is that for ease of placement the model will probably #always be given an offset from the root nodes position so as youre placing it in the editor its not clipping through #the ground, and some items might be given more or less of this vertical offset, if we do it at runtime by actually #checking where the ground is, you dont need to fuck around with this offset at the scene level, you just adjust #the script variable and the item can figure itself out, yeah its fancy but its also a nice creature comfort. if is_colliding(): start_height = get_collision_point().y + (1 * float_height) - (bounce_dist / 2.0) dest_height = start_height + (bounce_dist / 2.0) func _process(delta): t += bounce_speed * delta position.y = start_height + (dest_height - start_height) * curve.sample(t) if t >= 1.0: t = 0.0 rotation.y += spin_speed * delta