... now what if tweening were fun?
- C# (beta) · Godot 4.7.2 .NET
- GDScript (beta) · Godot 4.7.2
New way to juice our games just dropped!
Section titled “New way to juice our games just dropped!”tweens.gd is a fully free and libre open source tweening system for the Godot game engine.
This addon aims for concise and consistent syntax, and more flexible easing options than most.
tweens.gd respects your time and your keycaps.
Section titled “tweens.gd respects your time and your keycaps.”var tween = sprite.CreateTween();tween.TweenProperty(sprite, "position", new Vector2(400, 180), 0.6) .SetTrans(Tween.TransitionType.Cubic) .SetEase(Tween.EaseType.Out);
await ToSignal(tween, Tween.SignalName.Finished);GD.Print("Arrived");await sprite.TweenPosition((400, 180), 0.6, Out.Cubic).End;GD.Print("Arrived");var tween := sprite.create_tween()tween.set_trans(Tween.TRANS_CUBIC)tween.set_ease(Tween.EASE_OUT)tween.tween_property(sprite, "position", Vector2(400, 180), 0.6)
await tween.finishedprint("Arrived")var arrive := Tweens.position_2d([400, 180], 0.6, Out.CUBIC)
await Tweens.play(sprite, arrive).endprint("Arrived")var tween1 = sprite1.CreateTween();tween1.TweenProperty(sprite1, "position", new Vector2(400, 180), 0.6) .SetTrans(Tween.TransitionType.Cubic) .SetEase(Tween.EaseType.Out);
var tween2 = sprite2.CreateTween();tween2.TweenProperty(sprite2, "position", new Vector2(400, 180), 0.8) .SetTrans(Tween.TransitionType.Cubic) .SetEase(Tween.EaseType.Out);
var tween3 = sprite3.CreateTween();tween3.TweenProperty(sprite3, "position", new Vector2(400, 180), 1.0) .SetTrans(Tween.TransitionType.Cubic) .SetEase(Tween.EaseType.Out);
await ToSignal(tween3, Tween.SignalName.Finished);GD.Print("Arrived");var arrive = new Tweens.Position2D((400, 180), 0.6, Out.Cubic);
sprite1.Tween(arrive);sprite2.Tween(arrive with { Duration = 0.8 });await sprite3.Tween(arrive with { Duration = 1.0 }).End;GD.Print("Arrived");var tween1 := sprite1.create_tween()tween1.set_trans(Tween.TRANS_CUBIC)tween1.set_ease(Tween.EASE_OUT)tween1.tween_property(sprite1, "position", Vector2(400, 180), 0.6)
var tween2 := sprite2.create_tween()tween2.set_trans(Tween.TRANS_CUBIC)tween2.set_ease(Tween.EASE_OUT)tween2.tween_property(sprite2, "position", Vector2(400, 180), 0.8)
var tween3 := sprite3.create_tween()tween3.set_trans(Tween.TRANS_CUBIC)tween3.set_ease(Tween.EASE_OUT)tween3.tween_property(sprite3, "position", Vector2(400, 180), 1.0)
await tween3.finishedprint("Arrived")var arrive := Tweens.position_2d([400, 180], 0.6, Out.CUBIC)
Tweens.play(sprite1, arrive)Tweens.play(sprite2, arrive.with_duration(0.8))await Tweens.play(sprite3, arrive.with_duration(1.0)).endprint("Arrived")Huh… what even is all this?
Section titled “Huh… what even is all this?”… may your ferrets be long, and your code always short!
Section titled “… may your ferrets be long, and your code always short!”tweens.gd is made with math & ferrets, copyright © 2026 its contributors.
Godot logo by Andrea Calabró, licensed under CC BY 4.0.
"Easy, the Ferret" illustrations drawn by foxy_maria.
tweens.gd is released under the MIT License.
Godot is licensed under the MIT License.
tweens.gd is not affiliated with or endorsed by the Godot Foundation.