This has been a long road, but the exciting times are upon us! Thanks to our excellent contributors and our brave volunteer beta testers we are reaching the biggest milestone in the history of Godot so far. We are about to release Godot 4.0 stable. We are very proud of how it has shaped up, the features and enhancements that have been implemented, and most of all, we are proud to have collected such a brilliant team of talented individuals who have carried this major release on their wide and mighty shoulders.
But before we can cut the ribbon and break out the champagne, there are still a few preview releases we must go through, to establish, with your help, that we are truly ready. What you can expect from the next couple of weeks is the same cadence of official builds, aiming to minimize the iteration time between fixing bugs and checking for regressions. We will no longer make any breaking changes or include further enhancements. New features will have to wait for Godot 4.1 later this year. Instead, we will be coming down on the last critical issues we want to be resolved before we ship the first stable release of Godot 4.
There certainly will be remaining bugs, and your experience won’t be as frictionless as it is in the current stable version of Godot 3. It will take time to get to the same level of polish, but hopefully less time than before, thanks to our extended team of developers, and also new members learning about Godot only now and sharing their valuable feedback.
We are committed to evolving the engine further, and hope to see more of your amazing Godot projects soon!
Highlights
As we keep iterating from previous beta releases, these release notes are focused on the most recent changes (since beta 17). If you’re interested in what major features ship with Godot 4.0, check out our blog post for beta 1. Stay tuned for more articles about new features as we get closer to the stable version.
This release candidate includes some big changes which may interest a lot of users:
A large number of invalid behaviors is now correctly validated and reported in GDScript files (GH-72608). This includes some behaviors that previously appeared as working correctly but were never actually supported by the engine (such as override/shadowing of the engine’s native methods). You can turn errors into warnings, or disable them completely if you need to.
CanvasGroup
nodes will no longer appear darker than they should due to an incorrect shading logic (GH-72695).
The remaining reported cases of sub-resources IDs being shuffled without user input should now be resolved (GH-72257). While the issue should be fixed, this is not the final solution to the problem. We will continue improving the underlying systems in future versions of Godot to avoid this kind of situation.
A list of all global scripted classes can now be accessed with a new method, ProjectSettings.get_global_class_list()
(GH-71665). This method provides the information about your custom classes, which you cannot fetch from ClassDB
, and previously had to parse from the project file, or a cache file.
Under certain conditions, namely when particles were involved, stepping through the debugger might have been extremely slow and unresponsive. This should now be fixed (GH-72827).
Translation resources have been reorganized to reduce their impact on the size of the main repository (GH-70623). We have also finished setting up the Weblate platform for Godot 4, so translation efforts can begin!
Jump to the Downloads section.
You can also try the Web editor (early testing, it’s still slow and unstable).
The illustration picture for this article is from Sophia’s Rainbow, an upcoming open-source 3D platformer controller demo. It’s being created in Godot 4.0 beta by GDQuest, and you can check out their existing tutorials and projects in the meantime.
What’s new
See the changelog on GitHub, or the list of merged PRs, for an overview of all changes since 4.0 beta 17 (136 commits – excluding merge commits ― from 53 contributors).
The first Release Candidate concludes the beta stage, and thus it still includes a few API changes which may impact your Godot 4 projects. See the list of PRs with the breaks compat
label for details.
Some of the most notable feature changes in this update are:
- Android: Rename Godot’s ‘custom build’ to ‘gradle build’ to better reflect the underlying build process (GH-72552).
- Android: Improve Vulkan capability detection on Android (GH-72780, GH-72806, GH-72816).
- Animation: Improve naming consistency of animation nodes (GH-72509).
- Animation: Fix AnimationNodeTransition initialization and AnimationNode remapping method (GH-72722).
- Animation: Fix animation audio to play considering time when seeking (GH-72727).
- Animation: Fix AnimationTrackEditor doesn’t open when selecting
AnimationPlayer
node while another editor is open (GH-72805). - Animation: Fix AnimationEditor ignoring region of
Sprite2D
(GH-72812). - C#: Sync C# Array with Core (GH-71786).
- C#:
MSBuild
logs and panel enhancements (GH-72061). - C#: Qualify
Console
’s namespace to avoid mix-up with plugin’s objects (GH-72434). - C#: Set
AppContext.BaseDirectory
for editor builds and preserve directories in output during export (GH-72553, GH-72554). - C#: Implement
IEquatable<>
and equality operators for StringName
and NodePath
(GH-72633, GH-72635). - C#: Rename export settings
mono
-> dotnet
and remove unused AOT settings (GH-72849). - Core: Expose and document
ProjectSettings.get_global_class_list()
(GH-71665). - Core: Fix sub-resource IDs resetting when preloaded (GH-72257).
- Core: Fix several conditions for crashes in Camera2D (GH-72550, GH-72665).
- Core: Fix returning dangling data from a char
StringName
constructor (GH-72703). - Editor: Fix right-click on some files changes the ‘New’ menu entry to ‘Show in File Manager’ (GH-72576).
- Editor: Improve Editor Layout dialogs (GH-72559).
- Editor: Fix broken
scaled_orthogonal()
& subgizmo global scaling (GH-72669). - Editor: Improve Connect dialog navigation (GH-72741).
- Editor: Fix ghost SpriteFramesEditor causing crash (GH-72783).
- Editor: Fix jump to definition for methods using
Ctrl + LMB
when using self
(GH-72789). - Editor: Multiple fixes to over plugin handling (GH-72796).
- Editor: Fix some cases of stepping through the debugger being extremely slow (GH-72827).
- Editor: Bind
EditorExportPlugin._get_export_features
(GH-72860). - GDExtension: Expose
_err_print_error
with message parameter to GDExtension (GH-71865). - GDExtension: Remove unnecessary
stdio.h
from GDExtension interface (GH-72786). - GDExtension: Use
GDExtensionBool
in GDExtension interface (GH-72878). - GDScript: Cleanup function state connections when destroying instance (GH-65910).
- GDScript: Fix code-completion suggesting non-static members for custom classes (GH-70002).
- GDScript: Better handling of
@rpc
annotation and autocompletion (GH-72276). - GDScript: Fix unreachable code warning for
elif
block (GH-72330). - GDScript: Improve usability of setter chains (GH-72398).
- GDScript: Improve validation and documentation of
@export_flags
(GH-72493). - GDScript: Fix type certainty for result of ternary operator (GH-72512).
- GDScript: Fix
can_reference
check for typed arrays (GH-72546). - GDScript: Fix several conditions resulting in a crash (GH-72557, GH-72567, GH-72592).
- GDScript: Add warnings that are set to error by default (GH-72608).
- GDScript: Fix
await
type inference (GH-72677). - GDScript: Fix
@export_multiline
for PackedStringArray
(GH-72708). - GDScript: Don’t allow
@onready
without inheriting Node (GH-72794, GH-72804). - GUI: Use
min_size
/max_size
to limit window size and position with popup_center*
methods (GH-62179). - GUI: Fix some cases of wrong position of a popup in
OptionButton
(GH-69185). - GUI: Fix
SplitContainer
rendering and theming (GH-71862). - GUI: Fix
get_parent_anchorable_rect()
not returning the correct size in some cases (GH-72204). - GUI: Always show caret when moving in
LineEdit
(GH-72471). - GUI: Make
RichTextLabel
’s context menu customizable (GH-72651). - GUI: Fix crash related to using undefined system fonts (GH-72743).
- Import: Allow reimport appending of new files during the import process and use it for embedded glTF images (GH-72455, GH-72628).
- Import: Fixes to the glTF export with baking and null checks (GH-72700).
- Import: Better error handling for Blender RPC import (GH-72802).
- Input: Fix mouse/drag/touch
InputEvent
s having no device ID (GH-72740). - Input: Fix
Viewport.get_mouse_position
for SubViewports
(GH-71768). - Input: Fix several input and focus issues in X11 (GH-72785, GH-72826).
- Internationalization: Separate property translation from editor translation, move sources to separate
godot-editor-l10n
repo (GH-70623). - macOS: Fix splash screen minimum display time not working correctly (GH-72307).
- Navigation: Fix
NavigationMesh
baking AABB Editor handling and visuals (GH-72655). - Physics: Fix propagation order for 2D physics picking events (GH-68492).
- Rendering: Fix texture rect transpose for OpenGL (GH-72586).
- Rendering: Add layer slice support to render device and render buffers (GH-72589).
- Rendering: Fix
SoftBody3D
being incorrectly culled (GH-72631). - Rendering: Expose
RenderingServer.canvas_light_blend_mode
(GH-72643). - Rendering: Ignore instance color and instance
custom_data
when not used in the OpenGL renderer (GH-72681). - Rendering: Fix
MultiMesh
visible_instance_count
being ignored after the first frame (GH-72684). - Rendering: Avoid shading
CanvasGroup
nodes twice (GH-72695). - Rendering: Implement
cull_mask
for decals and lights in mobile and compatibility backends (GH-72810). - Rendering: Set instancing flags when using
GPUParticles
in OpenGL renderer (GH-72853). - Rendering: Optimize
draw_dashed_line()
and draw_rect()
(GH-72880). - Shaders: Allow
.gdshader
files in the 3-to-4 project convertor (GH-72334). - Shaders: Fix shader failure when using non-const initializer on a constant (GH-72494).
- Shaders: Prevent preview error for the instance parameter in visual shader (GH-72660).
- Windows: Fix window size for fullscreen windows during window creation (GH-72622).
- Windows: Update
last_focused_window
when the focused subwindow is deleted (GH-72624). - XR: Add XR environment blend mode support (GH-72604).
This release is built from commit c4fb119f0.
Downloads
The downloads for this dev snapshot can be found directly on our repository:
- Standard build (GDScript, GDExtension).
- .NET 6 build (C#, GDScript, GDExtension).
- Requires .NET SDK 6.0 or 7.0 installed in a standard location. .NET 7.0 support was recently merged and requires testing, please report any issue you experience with either version.
Known issues
With every release we accept that there are going to be various issues, which have already been reported but haven’t been fixed yet. See the GitHub issue tracker for a list of known bugs in the 4.0 milestone.
You will likely see this list reduced drastically over the coming days as we continue to re-triage those issues and postpone the ones that are not critical for the 4.0 release.
Bug reports
As a tester, you are encouraged to open bug reports if you experience issues with this release. Please check first the existing issues on GitHub, using the search function with relevant keywords, to ensure that the bug you experience is not known already.
As in any major release, there are going to be compatibility-breaking changes. However, we still try to provide a migration path for your projects. If you experience a regression without a known migration path or workaround, do not hesitate to report it.
Support
Godot is a non-profit, open source game engine developed by hundreds of contributors on their free time, and a handful of part or full-time developers hired thanks to donations from the Godot community. A big thank you to everyone who has contributed their time or financial support to the project!
If you’d like to support the project financially and help us secure our future hires, you can do so on Patreon or PayPal.