gdextを用いたgodotとrustのセットアップ方法
公式の方が詳しくて勉強になります。 とりあえず動かすだけの手順を抜粋しています。
前提
- Godot:4.2.2
- cargo:1.79.0
手順
rustプロジェクト作成
プロジェクト作成
cargo new rust --lib
Cargo.toml編集
[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 Engineで新規作成
プロジェクト名は「godot」
.gdextensionを作成
作成した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でビルドするとエラーになる
extension_list.cfgを作成
自動生成される「.godot」上で実施
res://.gdextension
godot公式チュートリアルに従ってプロジェクト作成
- Sprite2Dを作成
- Sprite2DのTextureにicon.svgをセットする
- Sprite2Dを画面中央に移動する
- player.tscnとして保存する
rustコード作成
lib.rs編集
use godot::prelude::*;
struct MyExtension;
#[gdextension]
unsafe impl ExtensionLibrary for MyExtension {}
player.rs作成
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側で動作確認
rustで作成したクラスを反映
- Sprite2Dを右クリック
- 型を変更...を選択
- 検索窓でPlayerを入力
- Playerを選択して変更
プロジェクトを実行(F5)する
godotのアイコンが時計回りで動いていたら完了