BaseButton in Godot – Complete Guide

Welcome to our comprehensive tutorial on the BaseButton class in Godot 4. If you’re starting your journey in game development or you’re looking to sharpen your user interface skills in Godot, you’ve landed on the perfect page. Buttons are a fundamental element in creating interactive applications and games, and mastering the BaseButton class will equip you with the tools to craft engaging user experiences. Stay tuned as we dive into the world of Godot’s UI elements and uncover the secrets of the BaseButton class!

What is the BaseButton Class?

The BaseButton class is a cornerstone in Godot’s robust user interface framework. As an abstract class, it’s the foundation upon which tangible button elements, such as Button, LinkButton, and TextureButton, are built. Although BaseButton doesn’t render anything on its own, it encapsulates the common functionalities that all GUI buttons share, including properties, signals, and methods to handle user interaction and feedback.

Understanding the Role of BaseButton

While it may seem abstract at first, the BaseButton class is instrumental in creating buttons with diverse behaviors. Whether you’re implementing a simple click-to-proceed button, a toggle button for game settings, or a button that responds to different mouse buttons, BaseButton serves as your starting point. By learning the ins and outs of this class, you’ll gain the flexibility to craft a variety of button types for your specific game design needs.

Why Should You Learn About BaseButton?

Understanding the BaseButton class is crucial for several reasons:

  • Flexibility: It allows you to create custom buttons that match the look and feel of your game.
  • Functionality: You’ll learn how to manage button states, actions, and groups, enabling you to control game flow and user interactions intricately.
  • Control: Armed with the knowledge of BaseButton, you can design a user interface that’s both intuitive and responsive, enhancing the player’s experience.

By mastering BaseButton, you set the stage for crafting intuitive and responsive UIs, ensuring your games engage and retain players. Let’s get started with Godot’s BaseButton and set the foundation for your game development skills to flourish.

CTA Small Image

Creating a Simple Button

Let’s start by creating a basic button that responds to clicks. We’ll use the Button class, which is a direct implementation of the BaseButton class.

var button =
button.text = "Click Me!"
button.connect("pressed", self, "_on_button_pressed")

func _on_button_pressed():
    print("Button was pressed!")

In this code, we instantiate a new Button, set its text to “Click Me!”, and connect its “pressed” signal to a function that will print a message to the console when the button is clicked.

Customizing Button Appearance

Godot allows you to customize buttons in various ways. Here’s how you can change the button’s appearance by modifying its properties:

button.rect_min_size = Vector2(200, 50)  # Sets the minimum size
button.disabled = true  # Disables the button
button.flat = true  # Gives the button a flat look

This code sets a minimum size for the button, disables it, and applies a flat design style to it.

Responding to Different Input Events

Buttons can respond to different types of input events. Below is how to make a button react to mouse hover and touch events:

# Respond to mouse entering the button area
button.connect("mouse_entered", self, "_on_button_mouse_entered")

# Respond to mouse exiting the button area
button.connect("mouse_exited", self, "_on_button_mouse_exited")

func _on_button_mouse_entered():
    button.modulate = Color(1, 1, 0)

func _on_button_mouse_exited():
    button.modulate = Color(1, 1, 1)

Here we connect the signals for mouse entered and exited and change the button’s color modulate property to give visual feedback to the player.

Implementing Toggle Buttons

Toggle buttons are used for settings that can be switched on and off. Here’s an example of creating a toggle button:

var toggle_button =
toggle_button.toggle_mode = true
toggle_button.text = "Toggle Me!"
toggle_button.connect("toggled", self, "_on_toggle_button_toggled")

func _on_toggle_button_toggled(button_pressed):
    if button_pressed:
        print("Toggle button is ON")
        print("Toggle button is OFF")

We set the toggle_mode property to true to make the button behave like a toggle. Then, we connect the “toggled” signal to handle the state change.

Stay tuned as we’ll delve deeper into the power of BaseButton in the following sections. We’ll explore more advanced features and how to leverage them to create immersive and interactive game interfaces.Continuing our journey with the BaseButton class in Godot 4, let’s explore some advanced features that can add depth to your game’s user interface.

Handling Long Presses

In certain situations, you may want a button that reacts to long presses, which can be useful for actions that require confirmation or a delay. Here’s how to implement a long-press button:

var long_press_button =
long_press_button.text = "Hold Me!"
long_press_button.long_press_time = 1.0  # Time in seconds
long_press_button.connect("button_up", self, "_on_long_press_button_up")

func _on_long_press_button_up():
    if long_press_button.pressed:
        print("Long press detected!")

By setting the `long_press_time`, we define how long a user must hold the button before it’s considered a long press. The `button_up` signal is then used to check the `pressed` state.

Adding Icons to Buttons

Visual cues are essential for a friendly UI. Godot makes it easy to add icons to your buttons. Here’s a code snippet that shows how to set an icon on a button:

var icon_button =
var icon_texture = preload("res://path_to_your_icon.png")
icon_button.icon = icon_texture
icon_button.text = "I Have an Icon!"

In the code above, we preload an icon texture and assign it to the `icon` property of the button.

Grouping Buttons for Exclusive Choice

When designing an interface where only one option can be selected at a time—like a set of radio buttons—you can group buttons together for exclusive choice.

var button_group =
var radio_button_1 =
var radio_button_2 = = button_group = button_group
radio_button_1.toggle_mode = true
radio_button_2.toggle_mode = true
radio_button_1.text = "Option 1"
radio_button_2.text = "Option 2"


By assigning the buttons to a `ButtonGroup`, we ensure that only one button in the group can be pressed at any time.

Using Custom Styles

To further customize the look of your buttons, use StyleBox resources for different states such as normal, hover, pressed, etc.

var styled_button =
var normal_style = preload("res://path_to_normal_stylebox.tres")
var pressed_style = preload("res://path_to_pressed_stylebox.tres")

styled_button.add_stylebox_override("normal", normal_style)
styled_button.add_stylebox_override("pressed", pressed_style)
styled_button.text = "Stylish Button!"

In this example, we preload styleboxes and use `add_stylebox_override` to apply custom styles to the normal and pressed states of the button.

Accessibility: Hints and Focus

Accessibility is key for ensuring all players can interact with your game. Godot’s BaseButton allows for setting tooltips and focus modes.

var accessible_button =
accessible_button.text = "Accessible Button"
accessible_button.hint_tooltip = "I'm an accessible button with a tooltip!"
accessible_button.focus_mode = Control.FOCUS_ALL

Setting a `hint_tooltip` provides additional information when hovering, while the `focus_mode` property ensures the button can be focused with keyboard navigation or a game controller.

By exploring these examples, you’re well on your way to mastering the BaseButton class in Godot 4, unlocking a rich world of UI possibilities. Whether you’re crafting simple click buttons or intricate toggle groups, the BaseButton class equips you with the foundation to create a coherent and engaging player experience. Stay tuned as we continue to unveil the vast potential of Godot’s UI components!Integrating buttons with animation can add a polished and dynamic feel to your game’s UI. Let’s look at how to incorporate animations into button interactions.

var animated_button =
animated_button.text = "Animated!"
animated_button.connect("mouse_entered", self, "_on_animated_button_mouse_entered")
animated_button.connect("mouse_exited", self, "_on_animated_button_mouse_exited")

# Assume an AnimationPlayer node is present in your scene as a sibling to the buttons
var animation_player = $AnimationPlayer

func _on_animated_button_mouse_entered():"button_hover_enter")

func _on_animated_button_mouse_exited():"button_hover_exit")

Here, when the mouse hovers over or leaves the button, we play different animations, such as a scale up or color change.

Next, let’s look at custom signals. Sometimes you’ll need your buttons to emit custom signals when pressed to handle specific game logic.

class_name CustomButton extends Button

signal custom_pressed(param)

func _ready():
    connect("pressed", self, "_on_custom_button_pressed")

func _on_custom_button_pressed():
    emit_signal("custom_pressed", "Custom parameter")

# Usage
var custom_button =
custom_button.text = "Custom Signal"
custom_button.connect("custom_pressed", self, "_on_custom_button_custom_pressed")

func _on_custom_button_custom_pressed(param):
    print("Custom button was pressed with parameter: %s" % param)

In this example, the custom button emits its own signal with an additional parameter when pressed, providing greater control over the button’s behavior.

Styling buttons to respond differently when disabled can improve user feedback. Here’s how to add custom styles to the button’s disabled state.

var disable_style_button =
var disabled_style = preload("res://path_to_disabled_stylebox.tres")

disable_style_button.disabled = true
disable_style_button.add_stylebox_override("disabled", disabled_style)
disable_style_button.text = "I'm Disabled"

By applying a `StyleBox` to the `disabled` state, we visually indicate that the button is not interactable.

Tool buttons can be beneficial in level editors or tools within your game. You can check if the button is in the “pressed” state and change the logic accordingly.

var tool_button =
tool_button.toggle_mode = true
tool_button.text = "Tool Mode"

func _process(delta):
    if tool_button.pressed:
        # Tool logic here

If `tool_button.pressed` is true, the game will run the tool logic on each `_process` call, acting as a persistent toggle switch for a particular mode or function.

Lastly, synchronizing button state with game settings can create a cohesive experience. Let’s say you have an audio mute button that needs to reflect whether the sound is on or off:

var mute_button =
mute_button.toggle_mode = true
mute_button.text = "Mute"
mute_button.pressed = is_audio_muted()  # Assume this function exists and returns a boolean
mute_button.connect("toggled", self, "_on_mute_button_toggled")

func _on_mute_button_toggled(button_pressed):
    set_audio_muted(button_pressed)  # Assume this function exists and sets the audio state

Here, we directly control the audio’s muted state by the button’s `pressed` property, ensuring the button’s state and actual game settings are always synced.

These examples serve as a bridge between simple button interactions and more complex, state-driven UI elements. By mastering these concepts and applying them to the BaseButton class, you can enhance the professionalism and usability of your Godot game interfaces.

Where to Go Next in Your Game Development Journey

If you’ve enjoyed unlocking the potential of the BaseButton class in Godot 4 and want to further your game development skills, our Godot Game Development Mini-Degree is the perfect next step. This comprehensive program is tailored to enhance your capability in building cross-platform games, offering a deep dive into topics that range from the essentials of GDScript to complex UI systems and engaging game mechanics. Whether you’re just starting out or looking to level up your existing knowledge, you will find valuable learning experiences in this Mini-Degree.

To explore a broader selection of topics, we invite you to browse our Godot courses, each designed to help you refine your skills and create a portfolio of real projects. Our courses provide flexibility and are packed with actionable, live coding lessons that cater to both beginners and experienced developers alike. With Zenva, you’ll get the guidance you need to take your creative ideas from inception to reality, build stunning games, and make your mark in the games industry. Start your learning journey with us today, and see where it can take you!


As you’ve seen throughout this tutorial, the BaseButton class is an incredibly powerful tool in the Godot engine, providing the basic structure for creating a myriad of interactive buttons. By leveraging the flexible and intuitive system that Godot offers, you can enhance the user experience of your games, making them stand out and resonate with players. Remember, the journey of game development is continuous, and there’s always something new to learn and master.

We at Zenva are committed to guiding you every step of the way. Our Godot Game Development Mini-Degree is designed to amplify your skills beyond the BaseButton, encompassing animation, scripting, and so much more. Whether you’re refining your craft or just starting, keep the momentum going and check out our courses for a truly transformative learning experience. Take your Godot knowledge to the next level with Zenva, where the possibilities are as limitless as your imagination.

Python Blog Image

FINAL DAYS: Unlock coding courses in Unity, Godot, Unreal, Python and more.