Maemaemae

gdextを用いたgodotとrustのセットアップ方法

公式の方が詳しくて勉強になります。 とりあえず動かすだけの手順を抜粋しています。  

前提

手順

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公式チュートリアルに従ってプロジェクト作成

公式チュートリアル

  1. Sprite2Dを作成
  2. Sprite2DのTextureにicon.svgをセットする
  3. Sprite2Dを画面中央に移動する
  4. 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で作成したクラスを反映

  1. Sprite2Dを右クリック
  2. 型を変更...を選択
  3. 検索窓でPlayerを入力
  4. Playerを選択して変更

プロジェクトを実行(F5)する

godotのアイコンが時計回りで動いていたら完了

参考

godotrust