Godot 4 & Rust 始め方
2025.06.19
どもです!
専ら、Tauriから最近はGodotさんです!
Godotは超軽量でしかも気軽に扱える反面、
設計思想からも分かるように、大規模や大人数で扱うようになるとすぐにカオスに破綻しやすい印象でした。
でも、個人開発とか持ってこいのゲームエンジンですね!
どっかどか、治安の悪いソースを生み出していきましょう!!(笑)
会社で使うとなると、かなり考えないとなぁ。。
というところで、とりあえず、Rustと連携するか。。
と godot-rustを使おうと思い、実装を始めたのですが、どうもGodot 3の情報など古い情報も混在していていたり、公式ドキュメントもなんか、上手くいかなかったりとフガフガしちゃったので、一旦まとめようかと思います。
Godot 4 で Rust を使う
Godot 4でRustを使うため、godot-rustを使用します。
GitHub
Crate
https://crates.io/crates/godot
まずは、公式ドキュメントのとおり、GodotのプロジェクトとRustのプロジェクトのディレクトリが並列で並ぶ様に、「rust_godot_project」ディレクトリを作成します。
rust_godot_project ├── godot └── rust
「rust_godot_project」ディレクトリ内で cargo newでRust プロジェクト生成。
cargo new --lib rust
Cargo.tomlファイルを以下を追加
[lib] crate-type = ["cdylib"] [dependencies] godot = "0.3.1"
godotクレートは、gitレポジトリ指定でも
[dependencies] godot = { git = "https://github.com/godot-rust/gdext.git", branch="master" }
lib.rsを以下に修正します。
mod player; use godot::prelude::*; struct RustExtension; #[gdextension] unsafe impl ExtensionLibrary for RustExtension {}
odot crate の prelude モジュールをスコープに入れることによって、gdext APIを利用できます。
RustExtensionは任意の名前で、今回「rust」でプロジェクトを生成したので、「RustExtension」としております。
Player.rsを作成します。
use godot::prelude::*; use godot::classes::{ISprite2D, Sprite2D}; #[derive(GodotClass)] #[class(base=Sprite2D)] struct Player { speed: f64, angular_speed: f64, base: Base<Sprite2D> } #[godot_api] impl ISprite2D for Player { fn init(base: Base<Sprite2D>) -> Self { godot_print!("Hello, world!"); Self { speed: 400.0, angular_speed: std::f64::consts::PI, base, } } fn physics_process(&mut self, delta: f64) { let radians = (self.angular_speed * delta) as f32; self.base_mut().rotate(radians); } }
公式ドキュメントをベースにPlayer.rsを作成します。
こちらのPlayer構造をGodotで利用する形となります。
ここまでできたら一旦 cargo buildを行います。
cargo build
この際、rustcが古いとエラーになることがあります。
Rustコンパイラの最低バージョンが rustc 1.87
と比較的新しいrustcを要求されますので気をつけましょう。以下のバージョンで更新。
rustup update stable
バージョン確認
rustc --version rustc 1.87.0 (17067e9ac 2025-05-09)
それでは、Godot側で作業を行います。
Godotでプロジェクト作成
Godotを起動し、godotという名前でプロジェクトを作成します。
プロジェクトパスは先ほど作成した「rust_godot_project」ディレクトリ内となります。
2D シーン押下で、新規2Dシーンを作成。
「Main」にリネームします。
GodotとRust接続のために肝となる「.gdextension」ファイルを「godot」プロジェクトに作成、配置します。
今回は「rust.gdextension」としてファイルを作成します。
rust.gdextension
[configuration] entry_symbol = "gdext_rust_init" compatibility_minimum = 4.1 reloadable = true [libraries] linux.debug.x86_64 = "res://../rust/target/debug/librust.so" linux.release.x86_64 = "res://../rust/target/release/librust.so" windows.debug.x86_64 = "res://../rust/target/debug/rust.dll" windows.release.x86_64 = "res://../rust/target/release/rust.dll" macos.debug = "res://../rust/target/debug/librust.dylib" macos.release = "res://../rust/target/release/librust.dylib" macos.debug.arm64 = "res://../rust/target/debug/librust.dylib" macos.release.arm64 = "res://../rust/target/release/librust.dylib"
[libraries]
セクションは、動的 Rust ライブラリのパスと一致するように更新する必要があります。
各プラットフォームに合わせたパスを記述しますが、macだけで良い場合は限定も行えます。
ファイル名は「lib{YourCrate}.dylib」という形になり、今回は「rust」プロジェクトで生成しているので、「librust.dylib」といった形になります。
ここまで行えば、先程Rust側で作成した「Player」structをノードとして追加することが可能となります。Mainシーンの子ノードとして Sprite2Dの「Player」ノードを追加します。
ファイルシステムより「icon.svg」をSprite2Dのテクスチャに適応。
大体真ん中あたりに移動させます。
godotをビルドすると、アイコンがくるくる回転します。上手くRustと連携できました。
更にチュートリアルに従って回転させる
更にチュートリアルに従って、アイコンを周回させましょう。
Rustのphysics_processを以下の様に修正します。
fn physics_process(&mut self, delta: f64) { let radians = (self.angular_speed * delta) as f32; self.base_mut().rotate(radians); let rotation = self.base().get_rotation(); let velocity = Vector2::UP.rotated(rotation) * self.speed as f32; self.base_mut().translate(velocity * delta as f32); }
修正後、Godotをビルドしてもまだ反映されません。
Rust側の修正の都度ビルドを行わないといけません。
cargo build
再び、Godotをビルドして確認。今回は上手くいきました。
という感じで、Rustを用いてGodotプロジェクト作成も進めて行けそうです。
が、一番行いたいのがWasmと連携で、こちらのクレート(だったかな)も存在するみたいなので調べて行きたいと思います。
業務上扱っていることもあって、今後はGodotに関することを発信していくことが増えそうなので宜しくお願いしますー!
今回のソースはこちらで参照することが可能です。
https://github.com/godot-game-samples/rust-godot-starter
それではぁ。
またまたぁ。