This tutorial covers how to create a spinning or indeterminate progress bar
using the Godot Engine. Progress bars are easily created
using the TextureProgress
control node, but a little more work is needed to
create one with a spinning or indeterminate effect.
Radial Progress Bar
To create a radial or circular progress bar, first create a TextureProgress
control node. This node is specifically for creating progress bars and already
has properties for handling standard linear progress bars along with radial
progress bars.
Set the Fill Mode
property to Clockwise
or Counter Clockwise
.
Add a texture to the Progress
property in the Textures
section. Under and
over textures can also be added to further customize the look of your progress
bar.
Then with the remaining default values, setting the Value
property under the
Range
section will fill in the progress bar to the correct position.
Spinning Progress Bar
Creating a spinning progress bar involves modifying and animating some of the
TextureProgress
properties.
First set the Range/Value
property to 100
, leaving the remaining properties
as their default values.
Change the Fill Degrees
property under Radial Fill
to the desired length of
your spinner.
Now when the Initial Angle
property is modified, the progress bar will appear
to rotate.
Animating the Spinner
Add a script to the TextureProgress
node with the following contents.
func _ready() -> void:
var tween: SceneTreeTween = get_tree().create_tween().set_loops()
tween.tween_property(self, "radial_initial_angle", 360.0, 1.5).as_relative()
This creates a new tween on the scene tree that animates the
radial_initial_angle
property of the TextureProgress
node. The
set_loops()
ensures the tween loops indefinitely.
The tween_property
method defines the animation of the radial_initial_angle
to the value of 360.0
in 1.5
seconds. The property is defined on self
since the script is attached directly to the TextureProgress
node. If your
script is on a different node, ensure the path to the TextureProgress
node is
included here.
The as_relative()
function ensures the property is modified relative to its
current value. This means that the property is always trying to change 360
degrees from its current value, instead of stopping when the initial angle
value hits 360 degrees.
Now you should have an animated spinner!