Godot 4 & WebAssemblyで、Hello WebAssembly! – godot-wasm
2025.06.21
どもです。
前回に引き続きGodotに関してです。
今回は、WasmをGodotで実行したいーということで、
前回はRustでFFIを行ったのですが、それはそれで処理パフォーマンスやこの言語が必ず使いたいー。
と言った時はよいのですが、「依存性」について考えるのであれば、
C#にしろ、RustにしろFFIでGodotを扱っている限りは、Godotの依存から抜けられていない状態です。
つまり、Godotじゃないと実行できないし、Godotじゃないゲームエンジンになった場合、そのまま再利用というのは難しいお話。
でも、WebAssemblyとなるとGodot以外にもWebやらサーバーやらとマルチプラットフォームで、完全疎結合で依存性低めなモジュールとして扱えるわけなんです。
ということで、今回はGodotでWasmが扱えるこちらを利用しました。
GitHub
Godot 4 で、WebAssemblyを扱う
では、早速Godotに「godot-wasm」をインストールしていきましょう。
任意の名前で新規プロジェクトを作成します。
AssetLibタブを選択し「wasm」を入力で、「godot-wasm」が見つかるので選択しインストール。
それでは、Rust側のプロジェクトも作成していきます。
任意の場所で、cargo newで新規プロジェクトを作成します。
cargo new --lib godot_wasm --vcs none
cd godot_wasm
作成されたCargo.tomlに「cdylib」を追加します。
[package] name = "godot_wasm" version = "0.1.0" edition = "2024" [lib] crate-type = ["cdylib"] [dependencies]
lib.rsを以下に修正。
lib.rs
#![no_main] #![no_std] use core::panic::PanicInfo; static MESSAGE: &str = "Hello WebAssembly!"; #[unsafe(no_mangle)] pub extern "C" fn hello() -> *const u8 { MESSAGE.as_ptr() } #[unsafe(no_mangle)] pub extern "C" fn hello_len() -> usize { MESSAGE.len() } #[panic_handler] fn panic(_info: &PanicInfo) -> ! { loop {} }
wasm32-unknown-unknownをtargetで追加し、ビルドコマンドを実行。
rustup target add wasm32-unknown-unknown cargo build --release --target wasm32-unknown-unknown
以下のパスにwasmファイルが生成されているので、こちらをGodotプロジェクトに追加します。
target/wasm32-unknown-unknown/release/godot_wasm.wasm
Godotのファイルシステムにドラッグ&ドロップで追加できます。
ファイル自体はファイルシステムに表示しませんが、追加されています。
それでは、Godotで2Dシーンを作成し、Mainにリネームしスクリプトをアタッチします。
main.gdを以下の様に修正していきます。
main.gd
@onready var wasm: Wasm = Wasm.new() func _ready() -> void: # WASMファイルをロード var file = FileAccess.open("res://godot_wasm.wasm", FileAccess.READ) var bytecode = file.get_buffer(file.get_length()) file.close() # インポートが不要なら空でOK var imports = {} # モジュールの読み込み wasm.load(bytecode, imports) # 関数 "hello" を呼び出す(引数なし) var ptr = wasm.function("hello", []) var len = wasm.function("hello_len", []) # メモリバッファからデータを取得(注意: [0] = 成功フラグ, [1] = PoolByteArray) var result = wasm.memory.seek(ptr).get_data(len) if result[0] == 0: var data: PackedByteArray = result[1] var text = data.get_string_from_utf8() print("from wasm:", text) else: print("Failed to read memory.")
GodotのコンソールにHello WebAssembly!が表示できれば成功です。
今回のファイルはこちらになります。
https://github.com/godot-game-samples/godot-wasm
少し名前を変更しております。
ではでは。
またまたぁ。