About
Introduction
Before you start
About Godot Engine
Organization of the documentation
About this documentation
List of features
Platforms
Editor
Rendering
2D graphics
2D tools
2D physics
3D graphics
3D tools
3D physics
Shaders
Scripting
Audio
Import
Input
Navigation
Networking
Internationalization
Windowing and OS integration
Mobile
XR support (AR and VR)
GUI system
Animation
File formats
Miscellaneous
System requirements
Godot editor
Desktop or laptop PC - Minimum
Mobile device (smartphone/tablet) - Minimum
Desktop or laptop PC - Recommended
Mobile device (smartphone/tablet) - Recommended
Exported Godot project
Desktop or laptop PC - Minimum
Mobile device (smartphone/tablet) - Minimum
Desktop or laptop PC - Recommended
Mobile device (smartphone/tablet) - Recommended
Frequently asked questions
What can I do with Godot? How much does it cost? What are the license terms?
Which platforms are supported by Godot?
Which programming languages are supported in Godot?
What is GDScript and why should I use it?
What were the motivations behind creating GDScript?
Which programming language is fastest?
What 3D model formats does Godot support?
Will [insert closed SDK such as FMOD, GameWorks, etc.] be supported in Godot?
How can I extend Godot?
How do I install the Godot editor on my system (for desktop integration)?
Windows
macOS
Linux
Is the Godot editor a portable application?
Why does Godot aim to keep its core feature set small?
How should assets be created to handle multiple resolutions and aspect ratios?
When is the next release of Godot out?
Which Godot version should I use for a new project?
Should I upgrade my project to use new Godot versions?
Should I use the Forward+, Mobile, or Compatibility renderer?
I would like to contribute! How can I get started?
I have a great idea for Godot. How can I share it?
Is it possible to use Godot to create non-game applications?
Is it possible to use Godot as a library?
What user interface toolkit does Godot use?
Why does Godot use the SCons build system?
Why does Godot not use STL (Standard Template Library)?
Why does Godot not use exceptions?
Does Godot use an ECS (Entity Component System)?
Why does Godot not force users to implement DOD (Data-Oriented Design)?
How can I support Godot development or contribute?
Who is working on Godot? How can I contact you?
Complying with licenses
What are licenses?
Requirements
Inclusion
Credits screen
Licenses screen
Output log
Accompanying file
Printed manual
Link to the license
Third-party licenses
Godot release policy
Godot versioning
Release support timeline
Which version should I use for a new project?
Should I upgrade my project to use new engine versions?
When is the next release out?
What are the criteria for compatibility across engine versions?
Documentation changelog
New pages since version 4.4
Editor
GDExtension
Migrating
Scripting
New pages since version 4.3
2D
3D
Debug
Editor
Migrating
Performance
Physics
Rendering
Shaders
New pages since version 4.2
About
2D
Contributing
GDExtension
Migrating
Rendering
XR
New pages since version 4.1
C#
Development
Migrating
I/O
Platform-specific
New pages since version 4.0
Development
Migrating
Physics
New pages since version 3.6
2D
3D
Animation
Assets pipeline
Development
Migrating
Physics
Scripting
Shaders
XR
New pages since version 3.5
New pages since version 3.4
3D
Animation
Editor
New pages since version 3.3
GDScript
New pages since version 3.2
3D
About
Best practices
Development
Editor
Export
Input
Math
Platform-specific
Physics
Shaders
Scripting
User Interface (UI)
New pages since version 3.1
Project workflow
2D
Audio
Math
Inputs
Internationalization
Shading
Networking
Plugins
Multi-threading
Creating content
Optimization
Legal
New pages since version 3.0
Step by step
Scripting
Project workflow
2D
3D
Physics
Animation
GUI
Viewports
Shading
Plugins
Platform-specific
Multi-threading
Creating content
Miscellaneous
Compiling
Engine development
Getting started
Introduction
Introduction to Godot
What is Godot?
What can the engine do?
How does it work and look?
Programming languages
What do I need to know to use Godot?
Learn to code with GDScript
Learn in your browser with the GDScript app
Overview of Godot's key concepts
Scenes
Nodes
The scene tree
Signals
Summary
First look at Godot's interface
The Project Manager
First look at Godot's editor
The five main screens
Integrated class reference
Learning new features
Making the most of this manual
Learning to think like a programmer
Learning with the community
Community tutorials
Godot's design philosophy
Object-oriented design and composition
All-inclusive package
Open source
Community-driven
The Godot editor is a Godot game
Separate 2D and 3D engines
Step by step
Nodes and Scenes
Nodes
Scenes
Creating your first scene
Changing a node's properties
Running the scene
Setting the main scene
Creating instances
In practice
Editing scenes and instances
Scene instances as a design language
Summary
Scripting languages
Available scripting languages
Which language should I use?
GDScript
.NET / C#
C++ via GDExtension
Summary
Creating your first script
Project setup
Creating a new script
Hello, world!
Turning around
Moving forward
Complete script
Listening to player input
Moving when pressing "up"
Complete script
Summary
Using signals
Scene setup
Connecting a signal in the editor
Connecting a signal via code
Complete script
Custom signals
Summary
Your first 2D game
Prerequisites
Contents
Setting up the project
Organizing the project
Creating the player scene
Node structure
Sprite animation
Coding the player
Choosing animations
Preparing for collisions
Creating the enemy
Node setup
Enemy script
The main game scene
Spawning mobs
Main script
Testing the scene
Heads up display
ScoreLabel
Message
StartButton
Connecting HUD to Main
Removing old creeps
Finishing up
Background
Sound effects
Keyboard shortcut
Sharing the finished game with others
Your first 3D game
Contents
Setting up the game area
Setting up the playable area
Player scene and input actions
Creating input actions
Moving the player with code
Testing our player's movement
Designing the mob scene
Removing monsters off-screen
Spawning monsters
Creating the spawn path
Spawning monsters randomly
Jumping and squashing monsters
Controlling physics interactions
Jumping
Squashing monsters
Killing the player
Hitbox with the Area node
Ending the game
Code checkpoint
Score and replay
Creating a UI theme
Keeping track of the score
Retrying the game
Adding music
Character animation
Using the animation editor
The float animation
Animating the mobs
Going further
Exploring the manual
Manual
Best practices
Introduction
Applying object-oriented principles in Godot
How scripts work in the engine
Scenes
Scene organization
How to build relationships effectively
Choosing a node tree structure
When to use scenes versus scripts
Anonymous types
Named types
Performance of Script vs PackedScene
Conclusion
Autoloads versus regular nodes
The cutting audio issue
Managing shared functionality or data
When you should use an Autoload
When and how to avoid using nodes for everything
Godot interfaces
Acquiring object references
Accessing data or logic from an object
Godot notifications
_process vs. _physics_process vs. *_input
_init vs. initialization vs. export
_ready vs. _enter_tree vs. NOTIFICATION_PARENTED
Data preferences
Array vs. Dictionary vs. Object
Enumerations: int vs. string
AnimatedTexture vs. AnimatedSprite2D vs. AnimationPlayer vs. AnimationTree
Logic preferences
Adding nodes and changing properties: which first?
Loading vs. preloading
Large levels: static vs. dynamic
Project organization
Introduction
Organization
Style guide
Importing
Ignoring specific folders
Case sensitivity
Version control systems
Introduction
Version control plugins
Official Git plugin
Files to exclude from VCS
Working with Git on Windows
Git LFS
Troubleshooting
The editor runs slowly and uses all my CPU and GPU resources, making my computer noisy
The editor stutters and flickers on my variable refresh rate monitor (G-Sync/FreeSync)
The editor or project takes a very long time to start
The Godot editor appears frozen after clicking the system console
The Godot editor's macOS dock icon gets duplicated every time it is manually moved
Some text such as "NO DC" appears in the top-left corner of the Project Manager and editor window
A microphone or "refresh" icon appears in the bottom-right corner of the Project Manager and editor window
The editor or project appears overly sharp or blurry
The editor or project appears to have washed out colors
The editor/project freezes or displays glitched visuals after resuming the PC from suspend
The project works when run from the editor, but fails to load some files when running from an exported copy
The project crashes frequently or instantly after opening it from the project manager
Editor introduction
Editor's interface
Using the Project Manager
Creating and importing projects
Opening and importing projects
Downloading demos and templates
Managing projects with tags
Recovery Mode
Inspector Dock
Usage
Project Settings
Changing project settings
Reading project settings
Manually editing project.godot
Advanced project settings
Script Editor
Introduction
Features
Usage
Default editor shortcuts
General editor actions
Bottom panels
2D / CanvasItem editor
3D / Spatial editor
Text editor
Script editor
Editor output
Debugger
File dialog
FileSystem dock
Scene tree dock
Animation track editor
TileMap editor
TileSet Editor
GridMap Editor
Project manager
Customizing the interface
Moving and resizing docks
Splitting the script or shader editor to its own window
Customizing editor layouts
Customizing editor settings
XR editor
Using the XR editor
XR devices support
Runtime Permissions
Tips & Tricks
Limitations & known issues
Android editor
Using the Android editor
Android devices support
Runtime Permissions
Tips & Tricks
Limitations & known issues
Web editor
Using the Web editor
Browser support
Limitations
Importing a project
Editing and running a project
Where are my project files?
Advanced features
Command line tutorial
Command line reference
Path
Setting the project path
Creating a project
Running the editor
Erasing a scene
Running the game
Debugging
Exporting
Running a script
Using an external text editor
Automatically reloading your changes
Using External Editor in Debugger
Official editor plugins
LSP/DAP support
Using the engine compilation configuration editor
Limitations
Managing editor features
Managing editor features
Introduction
Creating a profile
Sharing a profile
Migrating to a new version
Upgrading from Godot 3 to Godot 4
Should I upgrade to Godot 4?
Advantages of upgrading
Disadvantages of upgrading
Caveats of upgrading
Preparing before the upgrade (optional)
Running the project upgrade tool
Using the Project Manager
Using the command line
Fixing the project after running the project upgrade tool
Automatically renamed nodes and resources
Manually renaming methods, properties, signals and constants
Checking project settings
Checking Environment settings
Updating shaders
Updating scripts to take backwards-incompatible changes into account
ArrayMesh resource compatibility breakage
List of automatically renamed methods, properties, signals and constants
Porting editor settings
Updating version control settings
Upgrading from Godot 4.0 to Godot 4.1
Breaking changes
Core
Animation
2D nodes
3D nodes
GUI nodes
Physics
Rendering
Navigation
Networking
Editor plugins
Behavior changes
Updating your GDExtension for 4.1
Upgrading from Godot 4.1 to Godot 4.2
Breaking changes
Core
Animation
GUI nodes
Rendering
Text
GraphEdit
TileMap
XR
Upgrading from Godot 4.2 to Godot 4.3
Breaking changes
GDExtension
Animation
GUI nodes
Physics
Rendering
Text
Audio
Navigation
TileMap
XR
Editor plugins
Behavior changes
Core
Animation
GUI nodes
Multiplayer
Rendering
TileMap
Android
Upgrading from Godot 4.3 to Godot 4.4
Breaking changes
Core
GUI nodes
Physics
Rendering
Navigation
Editor plugins
Behavior changes
Core
Rendering
CSG
Android
Upgrading from Godot 4.4 to Godot 4.5
Breaking changes
Core
Rendering
GLTF
Text
XR
Editor plugins
Behavior changes
TileMapLayer
3D Model Import
Core
Navigation
Physics
Text
Upgrading from Godot 4.5 to Godot 4.6
Breaking changes
Core
Animation
3D
Rendering
GUI nodes
Networking
OpenXR
Editor
Behavior changes
Android
Core
Rendering
Navigation
Changed defaults
3D
Rendering
GUI nodes
2D
Introduction to 2D
2D workspace
Main toolbar
Coordinate system
2D Viewport
Node2D and Control node
Displaying 3D nodes in 2D
Canvas layers
Viewport and Canvas items
CanvasLayers
Viewport and canvas transforms
Introduction
Canvas transform
Global canvas transform
Stretch transform
Window transform
Transform order
Transform functions
Feeding custom input events
Rendering
2D lights and shadows
Introduction
Nodes
Point lights
Directional light
Common light properties
Setting up shadows
Normal and specular maps
Using additive sprites as a faster alternative to 2D lights
2D meshes
Introduction
Optimizing pixels drawn
Converting Sprite2Ds to 2D meshes
2D sprite animation
Introduction
Individual images with AnimatedSprite2D
Sprite sheet with AnimatedSprite2D
Sprite sheet with AnimationPlayer
Summary
2D particle systems
Intro
Time parameters
Drawing parameters
Particle Process Material Settings
ParticleProcessMaterial 2D Usage
Process material properties
Particle Flags
Spawn
Animated Velocity
Accelerations
Display
Emission Shapes
Customizing the process material
2D antialiasing
Introduction
Antialiasing property in Line2D and custom drawing
Multisample antialiasing (MSAA)
Custom drawing in 2D
Introduction
Drawing
Updating
Coordinates and line width alignment
Antialiased drawing
Tools
Example 1: drawing a custom shape
Example 2: drawing a dynamic line
2D Parallax
Introduction
Getting started
Scroll scale
Infinite repeat
Scroll offset
Repeat times
Split screen
Previewing in the editor
Physics and movement
2D movement overview
Introduction
Setup
8-way movement
Rotation + movement
Rotation + movement (mouse)
Click-and-move
Summary
Tools
Using TileSets
Introduction
Creating a new TileSet
Merging several atlases into a single atlas
Adding collision, navigation and occlusion to the TileSet
Assigning custom metadata to the TileSet's tiles
Creating terrain sets (autotiling)
Assigning properties to multiple tiles at once
Creating alternative tiles
Using TileMaps
Introduction
Specifying the TileSet in the TileMapLayer
Multiple TileMapLayers and settings
Opening the TileMap editor
Selecting tiles to use for painting
Painting modes and tools
Painting randomly using scattering
Saving and loading premade tile placements using patterns
Handling tile connections automatically using terrains
Handling missing tiles
3D
Introduction to 3D
3D workspace
Main toolbar
View menu of viewport
Coordinate system
Space and manipulation gizmos
Navigating the 3D environment
Using Blender-style transform shortcuts
Node3D node
3D content
Manually authored models (using 3D modeling software)
Generated geometry
Immediate geometry
2D in 3D
Environment
Preview environment and light
Cameras
Lights
Using 3D transforms
Introduction
Problems of Euler angles
Axis order
Interpolation
Say no to Euler angles
Introducing transforms
Manipulating transforms
Precision errors
Obtaining information
Setting information
Interpolating with quaternions
Transforms are your friend
Procedural geometry
Using the ArrayMesh
Setting up the ArrayMesh
Generating a rectangle
Generating a sphere
Saving
Using the MeshDataTool
Using the SurfaceTool
Using ImmediateMesh
What is geometry?
What is a Mesh?
What a Mesh is
Surfaces
Surface array
Tools
ArrayMesh
MeshDataTool
SurfaceTool
ImmediateMesh
Which one should I use?
3D text
Introduction
Label3D
Advantages
Limitations
TextMesh
Advantages
Limitations
Projected Label node (or any other Control)
Advantages
Limitations
Should I use Label3D, TextMesh or a projected Control?
Rendering
3D rendering limitations
Introduction
Texture size limits
Color banding
Depth buffer precision
Transparency sorting
Standard Material 3D and ORM Material 3D
Introduction
BaseMaterial 3D settings
Transparency
Shading
Vertex Color
Albedo
Metallic
Roughness
Emission
Normal map
Bent normal map
Rim
Clearcoat
Anisotropy
Ambient Occlusion
Height
Subsurface Scattering
Back Lighting
Refraction
Detail
UV1 and UV2
Sampling
Shadows
Billboard
Grow
Transform
Proximity and Distance Fade
Stencil
Material Settings
Render priority
Next Pass
3D lights and shadows
Introduction
Light nodes
Light number limits
Shadow mapping
Directional light
Omni light
Spot light
Shadow atlas
Balancing performance and quality
Using decals
Use cases
Quick start guide
Decal node properties
Decal rendering order
Tweaking performance and quality
Limitations
Physical light and camera units
Why use physical light and camera units?
Setting up physical light units
Setting up physical camera units
Particle systems (3D)
Creating a 3D particle system
3D Particle system properties
Process material properties
Particle flags
Spawn
Accelerations
Display
Collision
Sub-emitter
Customizing the process material
Particle sub-emitters
3D Particle trails
Particle turbulence
3D Particle attractors
3D Particle collisions
Complex emission shapes
High dynamic range lighting
Introduction
Computer displays
Scene linear & asset pipelines
Parameters of HDR
Global illumination
Introduction to global illumination
Using Voxel global illumination
Signed distance field global illumination (SDFGI)
Using Lightmap global illumination
Reflection probes
Faking global illumination
Environment and post-processing
Environment
Camera attributes
Environment options
Mid- and post-processing effects
Camera attribute options
Volumetric fog and fog volumes
Volumetric fog properties
Light interaction with volumetric fog
Using volumetric fog as a volumetric lighting solution
Balancing performance and quality
Using fog volumes for local volumetric fog
FogVolume properties
Custom FogVolume shaders
Faking volumetric fog using quads
3D antialiasing
Introduction
Multisample antialiasing (MSAA)
Temporal antialiasing (TAA)
AMD FidelityFX Super Resolution 2.2 (FSR2)
Fast approximate antialiasing (FXAA)
Sub-pixel Morphological Antialiasing (SMAA 1x)
Supersample antialiasing (SSAA)
Screen-space roughness limiter
Texture roughness limiter on import
Which antialiasing technique should I use?
Optimization
Using MultiMeshInstance3D
Introduction
Setting up the nodes
MultiMesh settings
Mesh level of detail (LOD)
Introduction
Visual comparison
Generating mesh LOD
Comparing mesh LOD visuals and performance
Configuring mesh LOD performance and quality
Using mesh LOD with MultiMesh and particles
Visibility ranges (HLOD)
How it works
Setting up visibility range
Visibility range properties
Configuration tips
Occlusion culling
Why use occlusion culling
How occlusion culling works in Godot
Setting up occlusion culling
Previewing occlusion culling
Performance considerations
Troubleshooting
Resolution scaling
Why use resolution scaling?
Resolution scaling options
Troubleshooting
Variable rate shading
What is variable rate shading?
Hardware support
Using variable rate shading in Godot
Tools
Prototyping levels with CSG
Introduction to CSG nodes
Prototyping a level
Using prototype textures
Converting to MeshInstance3D
Exporting as glTF
Using GridMaps
Introduction
Example project
Creating a MeshLibrary
Collisions
Materials
NavigationMeshes
Lightmaps
MeshLibrary format
Exporting the MeshLibrary
Using GridMap
Using GridMap in code
Third-person camera with spring arm
Introduction
What is a spring arm?
Spring arm with a camera
Setting up the spring arm and camera
Animation
Introduction to the animation features
Create an AnimationPlayer node
Computer animation relies on keyframes
Tutorial: Creating a simple animation
Scene setup
Adding an animation
Managing animation libraries
Adding a track
The second keyframe
Run the animation
Autoplay on load
Back and forth
Track settings
Keyframes for other properties
Edit keyframes
Using RESET tracks
Onion Skinning
Animation Markers
Animation Track types
Property Track
Position 3D / Rotation 3D / Scale 3D Track
Blend Shape Track
Call Method Track
Bezier Curve Track
Audio Playback Track
Animation Playback Track
Cutout animation
What is it?
Cutout animation in Godot
Making of GBot
Setting up the rig
Adjusting the pivot
RemoteTransform2D node
Completing the skeleton
Skeletons
IK chains
Animation tips
Setting keyframes and excluding properties
Creating a rest pose
Modifying rotation only
Keyframing IK chains
Visually move a sprite behind its parent
Setting easing curves for multiple keys
2D Skeletal deform
2D skeletons
Introduction
Setup
Creating the polygons
Creating the skeleton
Deforming the polygons
Internal vertices
Using AnimationTree
Introduction
AnimationTree and AnimationPlayer
Creating a tree
Blend tree
Blend2 / Blend3
OneShot
TimeSeek
TimeScale
Transition
StateMachine
BlendSpace2D and BlendSpace1D
For better blending
Root motion
Controlling from code
Playing videos
Supported playback formats
Setting up VideoStreamPlayer
Handling resizing and different aspect ratios
Displaying a video on a 3D surface
Looping a video
Video decoding conditions and recommended resolutions
Playback limitations
Recommended Theora encoding settings
Balancing quality and file size
FFmpeg: Convert while preserving original video resolution
FFmpeg: Resize the video then convert it
Chroma Key Videos
Scene Setup
Writing the Custom Shader
UI Controls
Signal Handling
Creating movies
Enabling Movie Maker mode
Command line usage
Choosing an output format
OGV (recommended)
AVI
PNG
Custom
Configuration
Quitting Movie Maker mode
Using high-quality graphics settings
Rendering at a higher resolution than the screen resolution
Post-processing steps
Converting OGV/AVI video to MP4
Converting PNG image sequence + WAV audio to a video
Cutting video
Resizing video
Reducing framerate
Generating accumulation motion blur with FFmpeg
Assets pipeline
Import process
Importing assets in Godot
Changing import parameters
Reimporting multiple assets
Automatic reimport
Files generated
Changing import resource type
Changing default import parameters
Further reading
Importing images
Supported image formats
Importing textures
Changing import type
Detect 3D
Import options
Compress > Mode
Compress > High Quality
Compress > HDR Compression
Compress > Normal Map
Compress > Channel Pack
Mipmaps > Generate
Mipmaps > Limit
Roughness > Mode
Roughness > Src Normal
Process > Fix Alpha Border
Process > Premult Alpha
Process > Normal Map Invert Y
Process > HDR as sRGB
Process > HDR Clamp Exposure
Process > Size Limit
Detect 3D > Compress To
SVG > Scale
Editor > Scale With Editor Scale
Editor > Convert Colors With Editor Theme
Importing SVG images with text
Best practices
Supporting high-resolution texture sizes in 2D without artifacts
Use appropriate texture sizes in 3D
Importing audio samples
Supported audio formats
Importing audio samples
Import options (WAV)
Force > 8 Bit
Force > Mono
Force > Max Rate
Edit > Trim
Edit > Normalize
Edit > Loop Mode
Compress > Mode
Import options (Ogg Vorbis and MP3)
Loop
Loop Offset
BPM
Beat Count
Bar Beats
Advanced import settings (Ogg Vorbis and MP3)
Best practices
Use appropriate quality settings
Use real-time audio effects to reduce file size
Importing translations
Games and internationalization
Supported formats
Importing 3D scenes
Available 3D formats
Exporting glTF 2.0 files from Blender (recommended)
Importing
.blend
files directly within Godot
Exporting DAE files from Blender
Importing OBJ files in Godot
Importing FBX files in Godot
Model export considerations
3D asset direction conventions
Exporting textures separately
Exporting considerations
Lighting considerations
Node type customization using name suffixes
Opting out
Remove nodes and animations (-noimp)
Create collisions (-col, -convcol, -colonly, -convcolonly)
Create Occluder (-occ, -occonly)
Create navigation (-navmesh)
Create a VehicleBody (-vehicle)
Create a VehicleWheel (-wheel)
Rigid Body (-rigid)
Animation loop (-loop, -cycle)
Material alpha (-alpha)
Material vertex color (-vcol)
Import configuration
Import workflows
Scene inheritance
Advanced Import Settings
Using the Advanced Import Settings dialog
Extracting materials to separate files
Animation options
Retargeting 3D Skeletons
To share animations among multiple Skeletons
Options for Retargeting
Bone Map
Remove Tracks
Bone Renamer
Rest Fixer
Exporting 3D scenes
Overview
Limitations
Blender ESCN exporter
Audio
Audio buses
Introduction
Decibel scale
Audio buses
Playback of audio through a bus
Adding effects
Automatic bus disabling
Bus rearrangement
Default bus layout
Audio effects
Amplify
BandLimit and BandPass
Capture
Chorus
Compressor
Delay
Distortion
EQ
EQ6, EQ10, EQ21
Filter
HardLimiter
HighPassFilter
HighShelfFilter
Limiter
LowPassFilter
LowShelfFilter
NotchFilter
Panner
Phaser
PitchShift
Record
Reverb
SpectrumAnalyzer
StereoEnhance
Audio streams
Introduction
AudioStream
AudioStreamPlayer
AudioStreamPlayer2D
AudioStreamPlayer3D
Reverb buses
Doppler
Sync the gameplay with audio and music
Introduction
Using the system clock to sync
Using the sound hardware clock to sync
Recording with microphone
The structure of the demo
Text to speech
Basic Usage
Requirements for functionality
Distro-specific one-liners
Troubleshooting
Best practices
Caveats and Other Information
Export
Exporting projects
Why export?
On PC
On mobile
Export menu
Export templates
Resource options
Configuration files
Exporting from the command line
PCK versus ZIP pack file formats
Exporting packs, patches, and mods
Use cases
Overview of PCK/ZIP files
Generating PCK files
Opening PCK or ZIP files at runtime
Troubleshooting
Summary
Feature tags
Introduction
Default features
Custom features
Overriding project settings
Default overrides
Taking feature tags into account when reading project settings
Customizing the build
Exporting for Windows
Architecture
Changing the executable icon
PCK embedding
Code signing
Setup
Environment variables
Export options
Exporting for Linux
Architecture
Environment variables
Export options
Exporting for macOS
Requirements
Code signing and notarization
If you have an Apple Developer ID Certificate and exporting from macOS
If you have an Apple Developer ID Certificate and exporting from Linux or Windows
If you do not have an Apple Developer ID Certificate
Signing Options
Notarization Options
Entitlements
Hardened Runtime Entitlements
App Sandbox Entitlement
Environment variables
Export options
Exporting for Android
Install OpenJDK 17
Download the Android SDK
Setting it up in Godot
Providing launcher icons
Exporting for Google Play Store
Optimizing the file size
Environment variables
Export options
Exporting for iOS
Requirements
Export a Godot project to Xcode
Active development considerations
Steps to link a Godot project folder to Xcode
Plugins for iOS
Environment variables
Troubleshooting
xcode-select points at wrong SDK location
Export options
Exporting for visionOS
Exporting for the Web
Export file name
WebGL version
Mobile considerations
Audio playback
Export options
Thread and extension support
Exporting as a Progressive Web App (PWA)
Limitations
Using cookies for data persistence
Background processing
Full screen and mouse capture
Audio
Networking
Clipboard
Gamepads
Serving the files
Interacting with the browser and JavaScript
Environment variables
Troubleshooting
Running the export locally shows another project instead
Export options
Manually changing application icon for Windows
Creating a custom ICO file
Changing the taskbar icon
Changing the file icon
Testing the result
Running Godot apps on macOS
App is signed, notarized and distributed via App Store
App is signed, notarized and distributed outside App Store
App is signed (including ad-hoc signatures) but not notarized
App is not signed, executable is linker-signed
Neither app nor executable is signed (relevant for Apple Silicon Macs only)
Gradle builds for Android
Set up the gradle build environment
Enabling the gradle build and exporting
One-click deploy
What is one-click deploy?
Supported platforms
Using one-click deploy
Troubleshooting
Android
Web
Exporting for dedicated servers
Editor versus export template
Export approaches
Exporting a project for a dedicated server
Starting the dedicated server
Next steps
File and data I/O
Background loading
Using ResourceLoader
Example
File paths in Godot projects
Path separators
Accessing files in the project folder (
res://
)
Accessing persistent user data (
user://
)
File logging
Converting paths to absolute paths or "local" paths
Editor data paths
Self-contained mode
Saving games
Introduction
Identify persistent objects
Serializing
Saving and reading data
Some notes
JSON vs binary serialization
JSON limitations
Binary serialization
Runtime file loading and saving
Plain text and binary files
Images
Audio/video files
3D scenes
Fonts
ZIP archives
Binary serialization API
Introduction
Full Objects vs Object instance IDs
Packet specification
0: null
1:
bool
2:
int
3:
float
4:
String
5:
Vector2
6:
Rect2
7:
Vector3
8:
Transform2D
9:
Plane
10:
Quaternion
11:
AABB
12:
Basis
13:
Transform3D
14:
Color
15:
NodePath
For old format:
For new format:
16:
RID
(unsupported)
17:
Object
18:
Dictionary
19:
Array
20:
PackedByteArray
21:
PackedInt32Array
22:
PackedInt64Array
23:
PackedFloat32Array
24:
PackedFloat64Array
25:
PackedStringArray
26:
PackedVector2Array
27:
PackedVector3Array
28:
PackedColorArray
Internationalization
Internationalizing games
Introduction
Configuring the imported translation
Localizing resources
Automatically setting a language
Locale vs. language
Converting keys to text
Placeholders
Translation contexts
Pluralization
Making controls resizable
TranslationServer
Bidirectional text and UI mirroring
Adding break iterator data to exported project
Structured text BiDi override
Localizing numbers
Localizing icons and images
Testing translations
Translating the project name
Localization using spreadsheets
Formatting
Specifying plural forms
Specifying translation contexts
CSV importer
Loading the CSV file as a translation
Localization using gettext (PO files)
Advantages
Disadvantages
Installing gettext tools
Creating the PO template
Automatic generation using the editor
Manual creation
Creating a messages file from a PO template
Loading a messages file in Godot
Updating message files to follow the PO template
Checking the validity of a PO file or template
Using binary MO files (useful for large projects only)
Extracting localizable strings from GDScript files
Using context
Updating PO files
POT generation custom plugin
Locale codes
List of supported language codes
List of supported script codes
List of supported country codes
Pseudolocalization
Introduction
Enabling and configuring pseudolocalization
Pseudolocalization configurations
Configuring pseudolocalization at runtime
Input handling
Using InputEvent
What is it?
How does it work?
Anatomy of an InputEvent
Input actions
InputMap
Input examples
Introduction
Events versus polling
Input events
InputMap
Capturing actions
Keyboard events
Keyboard modifiers
Mouse events
Mouse buttons
Mouse motion
Touch events
Mouse and input coordinates
About
Hardware display coordinates
Viewport display coordinates
Customizing the mouse cursor
Using project settings
Using a script
Cursor list
Controllers, gamepads, and joysticks
Supporting universal input
Which Input singleton method should I use?
Vibration
Differences between keyboard/mouse and controller input
Dead zone
"Echo" events
Window focus
Power saving prevention
Troubleshooting
My controller isn't recognized by Godot.
My controller has incorrectly mapped buttons or axes.
My controller works on a given platform, but not on another platform.
Controller features
LED color
Handling quit requests
Quitting
Handling the notification
On mobile devices
Sending your own quit notification
Math
Vector math
Introduction
Coordinate systems (2D)
Vector operations
Member access
Adding vectors
Scalar multiplication
Practical applications
Movement
Pointing toward a target
Unit vectors
Normalization
Reflection
Dot product
Facing
Cross product
Calculating normals
Pointing to a target
More information
Advanced vector math
Planes
Distance to plane
Away from the origin
Constructing a plane in 2D
Some examples of planes
Collision detection in 3D
More information
Matrices and transforms
Introduction
Matrix components and the Identity matrix
Scaling the transformation matrix
Rotating the transformation matrix
Basis of the transformation matrix
Translating the transformation matrix
Putting it all together
Shearing the transformation matrix (advanced)
Practical applications of transforms
Converting positions between transforms
Moving an object relative to itself
Applying transforms onto transforms
Inverting a transformation matrix
How does it all work in 3D?
Representing rotation in 3D (advanced)
Interpolation
Vector interpolation
Transform interpolation
Smoothing motion
Beziers, curves and paths
Quadratic Bezier
Cubic Bezier
Adding control points
Curve2D, Curve3D, Path and Path2D
Evaluating
Drawing
Traversal
Random number generation
Global scope versus RandomNumberGenerator class
The randomize() method
Getting a random number
Get a random array element
Get a random dictionary value
Weighted random probability
"Better" randomness using shuffle bags
Random noise
Cryptographically secure pseudorandom number generation
Navigation
2D navigation overview
Setup for 2D scene
3D navigation overview
Setup for 3D scene
Using NavigationServer
Communicating with the NavigationServer
Threading and Synchronization
2D and 3D NavigationServer differences
Waiting for synchronization
Server Avoidance Callbacks
Using NavigationMaps
Default navigation maps
Creating new navigation maps
Using NavigationRegions
Creating new navigation regions
Using navigation meshes
Baking a navigation mesh with a NavigationRegion
Baking a navigation mesh with the NavigationServer
Baking navigation mesh chunks for large worlds
Navigation mesh baking common problems
Navigation mesh script templates
Using NavigationPaths
Obtaining a NavigationPath
Using NavigationPathQueryObjects
Creating a basic path query
Path postprocessing options
Path simplification
Path metadata
Excluding or including regions
Path clipping and limits
Using NavigationAgents
NavigationAgent Pathfinding
NavigationAgent Pathfollowing
Pathfollowing common problems
NavigationAgent Avoidance
NavigationAgent Script Templates
Using NavigationObstacles
Obstacles and navigation mesh
Obstacles and agent avoidance
Static avoidance obstacles
Dynamic avoidance obstacles
Procedural obstacles
Using NavigationLinks
Navigation link script templates
Using NavigationLayers
Navigation debug tools
Enabling navigation debug
Navigation debug settings
Debug navigation mesh polygons
Debug edge connections
Debug performance
Connecting navigation meshes
Support different actor types
Support different actor locomotion
Support different actor area access
Optimizing Navigation Performance
Performance problems with parsing scene tree nodes
Performance problems with navigation mesh baking
Performance problems with NavigationAgent path queries
Performance problems with the actual path search
Performance problems with navigation map synchronization
Networking
High-level multiplayer
High-level vs low-level API
Mid-level abstraction
Hosting considerations
Initializing the network
Managing connections
Remote procedure calls
Channels
Example lobby implementation
Exporting for dedicated servers
Making HTTP requests
Why use HTTP?
HTTP requests in Godot
Preparing the scene
Scripting the request
Sending data to the server
Setting custom HTTP headers
HTTP client class
TLS/SSL certificates
Introduction
Obtain a certificate from a certificate authority
Generate a self-signed certificate
Using WebSockets
HTML5 and WebSocket
Using WebSocket in Godot
Minimal client example
Minimal server example
Advanced chat demo
WebRTC
HTML5, WebSocket, WebRTC
WebSocket
WebRTC
Using WebRTC in Godot
Minimal connection example
Local signaling example
Remote signaling with WebSocket
Performance
Introduction
Common
General optimization tips
Introduction
Measuring performance
Detective work
Profilers
Principles
Appendix
Optimization using Servers
Servers
RIDs
Creating a sprite
Instantiating a Mesh into 3D space
Creating a 2D RigidBody and moving a sprite with it
Getting data from the servers
CPU
CPU optimization
Measuring performance
CPU profilers
External profilers
Manually timing functions
Caches
Languages
Threads
SceneTree
Physics
GPU
GPU optimization
Introduction
Draw calls, state changes, and APIs
Pixel cost versus vertex cost
Pixel/fragment shaders and fill rate
Transparency and blending
Multi-platform advice
Mobile/tiled renderers
Optimization using MultiMeshes
MultiMeshes
Multimesh example
Reducing stutter from shader (pipeline) compilations
Pipeline precompilation monitors
Pipeline precompilation features
Pipeline precompilation instancing
Shader baker
3D
Optimizing 3D performance
Culling
Transparent objects
Level of detail (LOD)
Bake lighting
Animation and skinning
Large worlds
Animating thousands of objects
Animating thousands of fish with MultiMeshInstance3D
Controlling thousands of fish with Particles
Threads
Using multiple threads
Threads
Creating a Thread
Mutexes
Semaphores
Thread-safe APIs
Threads
Global scope
Scene tree
Rendering
Physics
Navigation
GDScript arrays and dictionaries
Resources
Physics
Physics introduction
Collision objects
Physics material
Collision shapes
Physics process callback
Collision layers and masks
Area2D
StaticBody2D
RigidBody2D
Using RigidBody2D
Contact reporting
CharacterBody2D
Character collision response
Using Jolt Physics
Introduction
Notable differences to Godot Physics
Joint properties
Single-body joints
Collision margins
Baumgarte stabilization
Ghost collisions
Memory usage
Ray-cast face index
Kinematic RigidBody3D contacts
Contact impulses
Area3D and SoftBody3D
WorldBoundaryShape3D
Notable differences to the Godot Jolt extension
Project settings
Joint nodes
Thread safety
Using RigidBody
What is a rigid body?
How to control a rigid body
The "look at" method
Using Area2D
Introduction
What is an area?
Area properties
Overlap detection
Area influence
Point gravity
Examples
Using CharacterBody2D/3D
Introduction
What is a character body?
Movement and collision
move_and_collide
move_and_slide
Detecting collisions
Which movement method to use?
Examples
Movement and walls
Bouncing/reflecting
Platformer movement
Ray-casting
Introduction
Space
Accessing space
Raycast query
Collision exceptions
Collision Mask
3D ray casting from screen
Ragdoll system
Introduction
Setting up the ragdoll
Creating physical bones
Clean up and optimize the skeleton
Adjust joints and constraints
Adjust collision shapes
Simulate the ragdoll
Collision layer and mask
Kinematic character (2D)
Introduction
Physics process
Scene setup
Moving the kinematic character
Using SoftBody3D
Physics engine considerations
Basic setup
Cloak simulation
Using imported meshes
Collision shapes (2D)
Primitive collision shapes
Convex collision shapes
Concave or trimesh collision shapes
Performance caveats
Collision shapes (3D)
Primitive collision shapes
Convex collision shapes
Concave or trimesh collision shapes
Performance caveats
Large world coordinates
Why use large world coordinates?
How large world coordinates work
Who are large world coordinates for?
Enabling large world coordinates
Compatibility between single-precision and double-precision builds
Known incompatibilities
Limitations
Physics Interpolation
Quick start guide
Introduction
Physics ticks and rendered frames
What can we do about frames and ticks being out of sync?
Using physics interpolation
Turn on the physics interpolation setting
Move (almost) all game logic from _process to _physics_process
Ensure that all indirect movement happens during physics ticks
Choose a physics tick rate
Call
reset_physics_interpolation()
when teleporting objects
Testing and debugging tips
Advanced physics interpolation
Exceptions to automatic physics interpolation
2D and 3D physics interpolation
Global versus local interpolation
Resetting physics interpolation
2D Particles
Other
Troubleshooting physics issues
Objects are passing through each other at high speeds
Stacked objects are unstable and wobbly
Scaled physics bodies or collision shapes do not collide correctly
Thin objects are wobbly when resting on the floor
Cylinder collision shapes are unstable
VehicleBody simulation is unstable, especially at high speeds
Collision results in bumps when an object moves across tiles
Framerate drops when an object touches another object
Framerate suddenly drops to a very low value beyond a certain amount of physics simulation
Physics simulation is unreliable when far away from the world origin
Platform-specific
Linux
Wayland/X11
Overview
When to use Wayland
Changing the setting
Disabling Libdecor loading
Android
Godot Android library
Using the Godot Android library
Godot Android plugins
Embedding Godot in existing Android projects
Godot Android plugins
Introduction
Android plugin
Building a v2 Android plugin
Packaging a v2 Android plugin
Using a v2 Android plugin
Reference implementations
Tips and Guidelines
Android in-app purchases
Usage
Integrating with Android APIs
JavaClassWrapper (Godot singleton)
AndroidRuntime plugin
Resolving crashes on Android
Getting Native Debug symbols for official templates
Getting Native Debug symbols for custom builds
Uploading Symbols to Google Play Console
Manually Symbolicating Crash Logs
iOS plugins
Creating iOS plugins
Loading and using an existing plugin
Creating an iOS plugin
Plugins for iOS
Accessing plugin singletons
Asynchronous methods
Store Kit
Game Center
Web
The JavaScriptBridge singleton
Interacting with JavaScript
Callbacks
Can I use my favorite library?
The eval interface
Downloading files
HTML5 shell class reference
Engine
Engine configuration
Custom HTML page for Web export
Setup
Starting the project
Customizing the behavior
Customizing the presentation
Debugging
Plugins
Editor plugins
Installing plugins
Finding plugins
Installing a plugin
Enabling a plugin
Making plugins
About plugins
Creating a plugin
A custom node
A custom dock
Registering autoloads/singletons in plugins
Using sub-plugins
Going beyond
Making main screen plugins
What this tutorial covers
Initializing the plugin
Main screen scene
Update the plugin script
Try the plugin
Import plugins
Introduction
Configuration
The EditorImportPlugin class
Options and presets
The
import
method
Platform variants and generated files
Trying the plugin
3D gizmo plugins
Introduction
The EditorNode3DGizmoPlugin
Simple approach
Alternative approach
Inspector plugins
Setting up your plugin
Interacting with the inspector
Adding an interface to edit properties
Visual Shader plugins
Running code in the editor
What is
@tool
?
How to use
@tool
Important information
Debugging
Try
@tool
out
Editing variables
Getting notified when resources change
Reporting node configuration warnings
Running one-off scripts using EditorScript
Instancing scenes
Rendering
Overview of renderers
Introduction
Renderers, rendering drivers, and RenderingDevice
Choosing a renderer
Switching between renderers
Feature comparison
Overall comparison
Lights and shadows
Global Illumination
Environment and post-processing
Antialiasing
StandardMaterial features
Shader features
Other features
Using Viewports
Introduction
Input
Listener
Cameras (2D & 3D)
Scale & stretching
Worlds
Capture
Viewport Container
Rendering
Render target
Multiple resolutions
The problem of multiple resolutions
One size fits all
Base size
Resizing
Stretch settings
Stretch Mode
Stretch Aspect
Stretch Scale
Stretch Scale Mode
Common use case scenarios
Desktop game
Mobile game in landscape mode
Mobile game in portrait mode
Non-game application
hiDPI support
Reducing aliasing on downsampling
Handling aspect ratios
Field of view scaling
Scaling 2D and 3D elements differently
Fixing jitter, stutter and input lag
What is jitter, stutter and input lag?
Distinguishing between jitter and stutter
Jitter
Stutter
Windows
Linux
macOS
Android
iOS
Input lag
Project configuration
Hardware/OS-specific
Reporting jitter, stutter or input lag problems
The Compositor
Compositor effects
Scripting
GDScript
GDScript reference
History
Example of GDScript
Identifiers
Keywords
Operators
Literals
Annotations
Comments
Code regions
Line continuation
Built-in types
Variables
Constants
Functions
Statements and control flow
Classes
Exports
Properties (setters and getters)
Tool mode
Memory management
Signals
Assert keyword
GDScript: An introduction to dynamic languages
About
Dynamic nature
Arrays
Dictionaries
For & while
While