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
少し名前を変更しております。
ではでは。
またまたぁ。








