公式の方が詳しくて勉強になります。 とりあえず動かすだけの手順を抜粋しています。
cargo new rust --lib
[package]
name = "rust"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"] # Compile this crate to a dynamic C library.
[dependencies]
godot = { git = "https://github.com/godot-rust/gdext", branch = "master", features = ["experimental-wasm", "lazy-function-tables"] }
cd rust
cargo build
プロジェクト名は「godot」
作成したgodotフォルダ直下に作成
[configuration]
entry_symbol = "gdext_rust_init"
compatibility_minimum = 4.2
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"
web.debug.wasm32 = "res://../rust/target/wasm32-unknown-emscripten/release/rust.wasm"
web.release.wasm32 = "res://../rust/target/wasm32-unknown-emscripten/release/rust.wasm"
※web版はgdextのバグでdebugでビルドするとエラーになる
自動生成される「.godot」上で実施
res://.gdextension
use godot::prelude::*;
struct MyExtension;
#[gdextension]
unsafe impl ExtensionLibrary for MyExtension {}
godotで作成したSprite2Dを制御するクラス
use godot::classes::Sprite2D;
use godot::engine::ISprite2D;
use godot::prelude::*;
#[derive(GodotClass)]
#[class(base=Sprite2D)]
struct Player {
speed: f64,
angular_speed: f64,
base: Base<Sprite2D>,
}
#[godot_api]
impl Player {}
#[godot_api]
impl ISprite2D for Player {
fn init(base: Base<Sprite2D>) -> Self {
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);
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のアイコンが時計回りで動いていたら完了