Singleton (Autoload)
2025/12/27
- Type
- Learning Resource
- Format
- Glossary Article
- Version
- General
- Subject Tags
- Created
- Updated
- 2026/02/16
- 2025/12/27
The singleton design pattern limits instantiating a class to a single instance. In other words, a singleton class has only one instance in the entire program.
Typically, singletons are globally accessible. You can access the singleton instance from anywhere in your code.
This pattern is useful when you need a piece of data and code shared across your entire application. For example, you might use a singleton to store the database of items in a game or to keep audio playing across different scenes.
Another good use case for singletons is when you need to provide an API to the rest of your codebase. For example, in Godot, the Input singleton offers an API to access the player's input from any script.
In GDScript in Godot, you cannot create a true singleton as there's no way to prevent a class from being instantiated more than once, and the singleton pattern is supposed to enforce that. However, in practice, we mostly use singletons in games to provide globally accessible data and APIs.
Godot has a built-in way to create an instance of a node script or scene and make it globally accessible using the "autoload" feature. It is not quite a singleton but serves most of the same purpose, and it is what Godot users typically use instead of a true singleton.
The autoload feature registers a script or scene, creates an instance at the root of the scene tree when the game starts, and makes it accessible from anywhere in your code by writing the autoload name. It's very convenient! A little too convenient.
Here's how you can create a singleton in Godot:
Now, you can access the auto-loaded node or scene from anywhere in your code using the name you chose in the autoload tab. Again, this is not a true singleton, but it serves the same purpose in practice.
You can prevent instantiating an autoload multiple times using a static variable to store a reference to the singleton instance. Here's an example of how you can do this:
class_name MySingleton extends Node
static var singleton_instance: MySingleton = null
func _init() -> void:
if singleton_instance == null:
singleton_instance = self
else:
printerr("Trying to create another instance of MySingleton. Deleting it.")
queue_free()This is the closest you can get in GDScript, as you cannot override the new() method of classes or the instantiate() method of scenes. So, you cannot prevent instantiating the class a second time; you can only delete the second instance if it happens.
Singletons are powerful tools, but they can also lead to problems if overused. The main risk with singletons is creating globally accessible data that can be modified from anywhere in your code. If you are not careful, as your code grows, it can become hard to track where and when the singleton data is modified, leading to hard-to-find bugs.
Also, the more you use a singleton, the more you couple your code to it. If you decide to change how the singleton works, you have to change a lot of your code and risk introducing bugs in many places.
Here are a few good cases when you may use singletons relatively safely:
If you need an API composed of only static functions or used in specific parts of your codebase, you might not need a singleton. You can use a regular class with static functions instead or a class you instantiate in the parts of your codebase that need it.
If you need data that can be easily saved and loaded from multiple places in your codebase, a resource is a better choice than a singleton. You can load the same resource from various places in your codebase, and it will point to the same instance. This is a good way to share data across your game without exposing it globally.
Don't stop here. Step-by-step tutorials are fun but they only take you so far.
Try one of our proven study programs to become an independent Gamedev truly capable of realizing the games you’ve always wanted to make.
Get help from peers and pros on GDQuest's Discord server!
20,000 membersJoin ServerThere are multiple ways you can join our effort to create free and open source gamedev resources that are accessible to everyone!
Sponsor this library by learning gamedev with us onGDSchool
Learn MoreImprove and build on assets or suggest edits onGithub
Contributeshare this page and talk about GDQUest onRedditYoutubeTwitter…