waited far too long for an initial commit but here we are
This commit is contained in:
35
Scripts/float_and_spin.gd
Normal file
35
Scripts/float_and_spin.gd
Normal file
@ -0,0 +1,35 @@
|
||||
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
|
Reference in New Issue
Block a user