このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

Godot 4 & WebAssemblyで、Hello WebAssembly! – godot-wasm

Godot

2025.06.21

どもです。

前回に引き続きGodotに関してです。

今回は、WasmをGodotで実行したいーということで、

前回はRustでFFIを行ったのですが、それはそれで処理パフォーマンスやこの言語が必ず使いたいー。

と言った時はよいのですが、「依存性」について考えるのであれば、

C#にしろ、RustにしろFFIでGodotを扱っている限りは、Godotの依存から抜けられていない状態です。

つまり、Godotじゃないと実行できないし、Godotじゃないゲームエンジンになった場合、そのまま再利用というのは難しいお話。

でも、WebAssemblyとなるとGodot以外にもWebやらサーバーやらとマルチプラットフォームで、完全疎結合で依存性低めなモジュールとして扱えるわけなんです。

ということで、今回はGodotでWasmが扱えるこちらを利用しました。

GitHub

godot-wasm

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

少し名前を変更しております。

ではでは。

またまたぁ。

 

 

 

 

Comment

Related Article

Godot 4 & WebAssemblyで、Hello WebAssembly! – godot-wasm

2025.06.21

CATEGORY LIST

LATEST NEWS

Godot 4 & WebAssemblyで、Hello WebAssembly! - godot-wasm

Godot

2025.06.21

Godot 4 & Rust 始め方

Rust

2025.06.19

ご、ごめん。。今はFlutterの気分じゃないんだ。。

Flutter

2025.05.30

AIのために働け。AI リーダブルコーディングな未来。

AI・Bot・algorithm

2025.05.21

Rustでつくる ふっかつのじゅもん

Rust

2025.04.29

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その5

Rust

2025.04.14

う、動くぞ! Mac mini Apple M4 Pro で PS3ソフトを遊ぶ。RPCS3 Mac版を起動

Game

2025.04.12

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その4

Rust

2025.04.10

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その3

Rust

2025.04.08

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その2

Rust

2025.04.07

時代を先取りし過ぎた ニューラルネットワークが導入されたゲーム『がんばれ森川君2号』を令和に嗜んでみる。

Game

2025.04.06

Tauri(Rust) × AI で作る GitGUIクライアントアプリ その1

Rust

2025.04.05

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US