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

Archives Details

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

Godot

2025.06.21

この記事は最終更新日から1年以上が経過しています。

どもです。

前回に引き続き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で様々なデータフォーマットを処理

2025.07.06

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

2025.06.21

CATEGORY LIST

LATEST NEWS

【2026】【VMware Fusion】MacでWindowsを無料で扱う。

windows

2026.07.19

Raspberry Pi 5 でマインクラフトサーバーを立てる(Java版 × 統合版クロスプレイ対応)

RaspberryPi

2026.06.24

ラズパイが高い。

RaspberryPi

2026.05.26

【Claude Code】フル稼働。ToDo Appを様々なGUIフレームワーク用いて作らせる。

AI・Bot・algorithm

2026.05.24

Macで歩く「たのしいバイナリの歩き方」うさみみハリケーンの代わりに、Cheat Engine / Bit slicerを使用する

アセンブラ

2026.04.12

Macで歩く「たのしいバイナリの歩き方」

アセンブラ

2026.04.10

【Railway】ひたすら安く個人開発サービスを運用する計画

サーバー

2026.04.06

たびのきろく

イベント

2026.02.23

【Railway】MySQLサービスをコスト抑えて運用する

運用

2026.01.19

あけましておめでとうございますmm DjangoアプリをRailwayに移行する。

運用

2026.01.06

効率の良い AI駆動開発について考える

AI・Bot・algorithm

2025.11.09

MacとClaude Codeで構築する cc65(NES)開発環境

Game

2025.10.24

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

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

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

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

FOLLOW US