Convert Figma logo to code with AI

godot-rust logogdext

Rust bindings for Godot 4

2,961
183
2,961
90

Quick Overview

Godot-rust/gdext is a Rust binding for the Godot game engine, allowing developers to write Godot games and tools in Rust. It provides a high-level API for interacting with Godot's features and functionality, enabling the use of Rust's safety and performance benefits in Godot game development.

Pros

  • Combines Rust's safety and performance with Godot's powerful game development features
  • Provides a high-level, idiomatic Rust API for Godot
  • Supports automatic code generation for Godot classes and methods
  • Offers seamless integration with Godot's editor and export system

Cons

  • Requires knowledge of both Rust and Godot, which may increase the learning curve
  • May have limitations compared to GDScript for certain Godot-specific features
  • Documentation and community support might be less extensive than GDScript or C#
  • Potential performance overhead due to language interop in some cases

Code Examples

  1. Registering a custom class:
#[derive(GodotClass)]
#[class(base=Node)]
struct Player {
    #[base]
    base: Base<Node>,
    speed: f32,
}

#[godot_api]
impl INode for Player {
    fn init(base: Base<Node>) -> Self {
        Self { base, speed: 100.0 }
    }
}
  1. Implementing a custom method:
#[godot_api]
impl Player {
    #[func]
    fn move_player(&mut self, delta: f64) {
        let input = Input::singleton();
        let mut velocity = Vector2::ZERO;
        
        if input.is_action_pressed("move_right".into()) {
            velocity.x += 1.0;
        }
        if input.is_action_pressed("move_left".into()) {
            velocity.x -= 1.0;
        }
        
        self.base_mut().translate(velocity * self.speed * delta as f32);
    }
}
  1. Connecting a signal:
#[godot_api]
impl Player {
    #[func]
    fn _ready(&mut self) {
        let timer = self.base().get_node("Timer").unwrap().cast::<Timer>();
        timer.connect("timeout".into(), self.base().callable("on_timer_timeout"));
    }

    #[func]
    fn on_timer_timeout(&mut self) {
        godot_print!("Timer timed out!");
    }
}

Getting Started

  1. Install Rust and Cargo
  2. Install Godot 4.x
  3. Create a new Godot project
  4. Add the following to your Cargo.toml:
[dependencies]
godot = { git = "https://github.com/godot-rust/gdext", branch = "master" }
  1. Create a lib.rs file in your src directory with:
use godot::prelude::*;

struct MyExtension;

#[gdextension]
unsafe impl ExtensionLibrary for MyExtension {}
  1. Compile your Rust code and link it with Godot

For detailed instructions, refer to the official godot-rust/gdext documentation.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

logo.png

Rust bindings for Godot 4

Website | Book | API Docs | Discord | Mastodon | Twitter | Sponsor

gdext is a library to integrate the Rust language with Godot 4.

Godot is an open-source game engine, focusing on a productive and batteries-included 2D and 3D experience.
Its GDExtension API allows integrating third-party languages and libraries.

If you are looking for a Rust binding for Godot 3 (GDNative API), check out gdnative.

Philosophy

The Rust binding is an alternative to GDScript, with a focus on type safety, scalability and performance.

The primary goal of gdext is to provide a pragmatic Rust API for game developers.

Recurring workflows should be simple and require minimal boilerplate. APIs are designed to be safe and idiomatic Rust wherever possible. Due to interacting with Godot as a C++ engine, we sometimes follow unconventional approaches to provide a good user experience.

Development status

The gdext library has evolved a lot during 2023 and 2024 and is now in a usable state for smaller projects. However, there are still certain things to keep in mind.

[!WARNING]
The public API introduces breaking changes from time to time. Most of these are motivated by new features and improved ergonomics for existing ones. See also API stability in the book.

Features: While most Godot features are available, some less commonly used ones are missing. See #24 for an up-to-date overview. At this point, there is little support for Android or iOS, and Wasm is experimental. Contributions are very welcome!

Bugs: Most undefined behavior related to the FFI layer has been ironed out, but there may still be occasional safety issues. Apart from that, new additions to the library are typically not feature-complete from the start, but become more robust with feedback and testing over time. To counter bugs, we have an elaborate CI suite including clippy, unit tests, engine integration tests and memory sanitizers. Even hot-reload is tested!

Getting started

To dive into Rust development with gdext, check out the godot-rust book. The book is still under construction, but already covers a Hello World setup as well as several more in-depth chapters.

To consult the API reference, have a look at the online API Docs.

Furthermore, we provide a small example game in the examples/dodge-the-creeps directory.
The example examples/hot-reload demonstrates hot-reloading in the Godot editor.

If you need help, join our Discord server and ask in the #help-gdext channel!

License

We use the Mozilla Public License 2.0. MPL tries to find a balance between permissive (MIT, Apache, Zlib) and copyleft licenses (GPL, LGPL).

The license provides a lot of freedom: you can use the library commercially and keep your own code closed-source, i.e. game development is not restricted. The main condition is that if you change gdext itself, you need to make those changes available (and only those, no surrounding code).

Contributing

Contributions are very welcome! If you want to help out, see Contributing.md for some pointers on getting started.