It’s that time once again: feature freeze! With this, no new features will be integrated for Godot 4.8 moving forward, and priorities will be shifting exclusively towards bugfixes and addressing regressions to ensure a functional baseline as soon as possible. So join us for one last round-up of features, as we prepare for the beta transition!
Please consider supporting the project financially, if you are able. Godot is maintained by the efforts of volunteers and a small team of paid contributors. Your donations go towards sponsoring their work and ensuring they can dedicate their undivided attention to the needs of the project.
Jump to the Downloads section, and give it a spin right now, or continue reading to learn more about improvements in this release. You can also try the Web editor, the XR editor, or the Android editor for this release. If you are interested in the latter, please request to join our testing group to get access to pre-release builds.
The cover illustration is from 20 More, Somehow Even Smaller, Mazes, a successor to 20 Small Mazes, featuring 20 more mazes that’re somehow even smaller. You can get the game for free on Steam, and follow the developer on YouTube or Bluesky.
Highlights
In case you missed them, see the 4.8 dev 1, 4.8 dev 2, 4.8 dev 3, 4.8 dev 4, 4.8 dev 5, and 4.8 dev 6 release notes for an overview of some key features which were already in those snapshots, and are therefore still available for testing in 4.8 dev 7.
Editor: Symbol renaming
Tomasz Chabora has been hard at work in the editor throught the entirety of Godot 4.8’s development, and is going out with a bang with GH-117949 introducing symbol renaming! This has consistently hovered around the top of the list for most-requested features for multiple years now, and managed to squeeze in at the very last second before feature freeze set in. With this, renaming a symbol will properly propogate that logic across the project, uniformly applying the rename where relevant.
Here’s the tool differentiating a class identifier from a comment and string:
Here’s the tool differentiating local variables which share the same name across different methods:
As this was such a last-second addition, the feature is currently marked as “experimental” and temporarily requires an opt-in. While we’re reasonably confident in the implementation as it stands, we wanted a few extra precautions to ensure that users could try this without having to wait for Godot 4.9 or later.
Editor: Game view CanvasItem manipulation
Michael Alexsander keeps the editor train rolling with another highly-requested feature: runtime manipulation of CanvasItems! Thanks to his work in GH-122510, the following functionality is now fully integrated within Godot 4.8 (lifted verbatim from the original PR):
- Movement, resizing, rotation, scaling, and pivot modification of
CanvasItems, together with its own toolbar. - Full undo/redo support, unified in the editor’s undo/redo manager.
- Added the ability to open scenes by double-clicking them in the game. Just like how it’s done in the editor.
- Improved remote shortcut handling. Which is now funneled into a single debugger message, and triggers the pressed visual on the buttons.
- Improved mouse cursor updates in the editor. Now they trigger immediately rather than after an action is taken with the mouse again.
Rendering: Animated decals
While our decals have gotten some attention this development cycle, perhaps the most stand-out addition comes at the hands of Colin O’Rourke. Being the brain behind DrawableTexture, it should come as no surprise that he managed to wrangle them once again with GH-115653, enabling decals to be fully animated.
Physics: Add non-allocating query methods for PhysicsDirectSpaceState2D/3D
Those of you who’ve been following Godot since 4.0 dropped might be familiar with this zero allocation API proposal by Juan Linietsky, in which he highlighted some potential avenues for alleviating allocations in our bindings. While we’ve since taken several steps towards improving performance and resolving unnecessary allocations internally, the core of the issue persists even now. While foundational changes will be necessary to truly do away with the issue, we’re able to significantly mitigate these concerns by introducing classes which act as a middle-man of sorts, preventing unnecessary allocations and preserving type hints.
Enter aterray, who collaborated with Ricardo Buring and Mikael Hermansson to implement several such classes in GH-113970 for PhysicsDirectSpaceState2D and PhysicsDirectSpaceState3D. By leveraging these new methods, result objects can be successfully reused to avoid unnecessary dictionary and array allocations on every call.
var result := PhysicsCastMotionResult3D.new()
func _physics_process(delta: float) -> void:
if direct_space_state.cast_motion_into(params, result):
...
As previously mentioned, these new objects are strongly typed. As such, the need for manual type declarations and dictionary lookups are no longer required.
# Old implementation:
var dict := direct_space_state.intersect_ray(params)
if dict:
# Cannot infer the type of "normal"
# var normal := dict["normal"]
var normal: Vector3 = dict["normal"]
# New implementation:
var result := PhysicsIntersectRayResult3D.new()
if direct_space_state.intersect_ray_into(params, result):
var normal := result.get_normal() # Inferred as Vector3.
var position := result.get_position() # Inferred as Vector3.
GUI: Native touch support for TabBar and PopupMenu
GUI fans rejoice, as you’re getting two lovely GUI additions in Godot 4.8, courtesy of Anish Kumar. These additions are in the form of fully-native touch support for TabBar (GH-122960) and PopupMenu (GH-123576), delivering some excellent quality-of-life for our users and developers on touch-based devices.
The additions to TabBar are especially easy to showcase thanks to the main screen’s recent conversion to docks, but this functionality will be available to any and all TabBar instances.
PopupMenu is similarly simple to convey through the editor, and is equally available to any and all instances of PopupMenu.
The large scrollbar shown in the video is specific to the editor, serving as a vestige of pre-touch functionality. Its size will be reduced in the near future.
Audio: Add theme sound items and playback on common UI events
Hugo Locurcio continues to give GUIs some love with GH-111455, bringing proper audio functionality to many of those elements. Now developers can take advantage of sound events to trigger audio effects on-command with the new “audio” theme item type, including the ability to alter them with the theme override system.
Currently, custom controls cannot play theme audio items. This will be rectified by GH-123867, slated for integration shortly after 4.8 dev 7 releases.
Platforms: AccessKit for iOS and Android
Godot 4.5 saw the integration of screen reader support for desktop platforms. This was thanks to the wonderful UI utility AccessKit, providing a reliable infrastructure for accessibility options. The reason it was limited to desktop platforms at the time came down to the logistics of the API and not wanting to keep accessibility options locked-off while other platforms were resolved. However, we never stopped pursuing its integration across other platforms; after all:
Accessibility should be every developer’s top priority, full-stop.
That’s why we’re thrilled to announce that two major platforms will be gaining native AccessKit support: iOS and Android! The former is brought to us by first-time contributor Ben Humphries in GH-119750, while the latter is provided by our primary AccessKit maintainer bruvzg in GH-117785. While the amount of features on offer for these devices might not be on the same level as their desktop equivalents, the door is now wide-open for further improvements, so we eagerly await everyone’s testing and feedback!
The AcccessKit iOS implementation still has some inherent limitations, such as a lack of support for editable text fields. Progress on this can be tracked on this issue in the AccessKit repository.
And more!
There are too many exciting changes to list them all here, but here’s a curated selection:
- Animation: Add makima interpolation and refactor animation key retrieving partially (GH-123835).
- C#: Optimize C++ to .NET calls with delegate* and hash map lookup (GH-116300).
- C#: Upgrade packages and minimum TFM required to
net10.0(GH-123738). - Core: Introduce
Variant.to<Type>()as a replacement to implicit conversions fromVariant(GH-123600). - Physics: Replace
NOTIFICATION_DEBUG_COLLISIONS_HINT_CHANGEDwith a signal (GH-102963). - Platforms: Android: Export project as an Android Archive (AAR) (GH-123574).
- Platforms: Web: Implement Web Editor debugger via MessagePort (GH-123327).
Changelog
80 contributors submitted 182 fixes for this release. See our interactive changelog for the complete list of changes since 4.8 dev 6. You can also review all changes included in 4.8 compared to the previous 4.7 feature release.
This release is built from commit c971f93e7.
Downloads
Standard build includes support for GDScript and GDExtension.
.NET build (marked as mono) includes support for C#, as well as GDScript and GDExtension.
- .NET 10.0 or newer is required for this build, changing the minimal supported version from .NET 8 to 10.
While engine maintainers try their best to ensure that each preview snapshot and release candidate is stable, this is by definition a pre-release piece of software. Be sure to make frequent backups, or use a version control system such as Git, to preserve your projects in case of corruption or data loss.
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 complete list of known bugs.
- Steam Deck built-in controls no longer work in Linux export GH-123704. Can be worked around by switching from Gaming Mode to Desktop Mode.
Bug reports
As a tester, we encourage you to open bug reports if you experience issues with this release. Please check the existing issues on GitHub first, using the search function with relevant keywords, to ensure that the bug you experience is not already known.
In particular, any change that would cause a regression in your projects is very important to report (e.g. if something that worked fine in previous 4.x releases, but no longer works in this snapshot).
Support
Godot is a non-profit, open-source game engine developed by hundreds of contributors in their free time, as well as a handful of part and full-time developers hired thanks to generous donations from the Godot community. A big thank you to everyone who has contributed their time or their 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 using the Godot Development Fund platform managed by the Godot Foundation. There are also several alternative ways to donate which you may find more suitable.
