GodotでSteam対応を行う際に、一瞬どうすれば良いのかと悩む問題にSteam APIをどう使うかという問題があります。実は Godotには便利なアドオンとして、GodotSteam というユーティリティがあります。今回は、この GodotSteam のインストールと基本的な使い方について解説します。長くなるため、後半はかなり端折るのはご容赦ください。



  • インストール
Godotのアセットライブラリからダウンロードするという方法もありますが、私は自分でダウンロードして自分でインストールするという方法を選択しました。まずは以下のサイトから GodotSteam アーカイブをダウンロードしてください。



click for download
ページの中央に Download とボタンがあるのでクリックします。
click for Standard
この画面になります。日本人だと面食らうかもですが、落ち着いて Standard をクリックします。
select download type
Godot のバージョン確認です。ここでは記事作成時(2026/03/24)の最新である 4.6.1 が欲しいとします。Godot 4.x グループ内の Download GDExtension をクリックします。
last check download
アセットライブラリの最終確認画面です。Download ボタンをクリックします。執筆時点では godotsteam-1a975d21440025be4b90952394de86053893813f.zip が落ちてきます。これは、落ちてくるバージョンなどによってFILE_NAMEは変わると思われます。

zip ファイルを解凍すると4階層のフォルダが出来ます。addons フォルダを .godot フォルダが有る場所にまるごとコピーしてください。その後、Godot を再起動すれば、自動的に認識して GodotSteam が使用できるようになります。



  • 初期設定
まず、AppID を用意します。これは Steamworks で作成することになります。本来の趣旨とはハズレますので AppID の作り方はここでは説明しません。単にテストだけであれば、AppID は仮番号 480 を使用できます。

GodotSteam アドオンが正常に認識されていれば、Steam という名前空間が既に使えるようになっているはずです。そのため、起動直後に一回だけ Steam.steamInit(appID) を呼び出すだけでシステムは初期化されます。戻り値が true なら初期化成功、false なら失敗です。

あと、Steam の結果を受け取るためのポーリング処理として、_process から Steam.run_callbacks() を呼び出すようにします。これは引数も何もなくて、単に呼び出し続けるだけで OK です。

以上の初期化のため、Steam 関連の処理は steamManager.gd などと専用のスクリプトファイルを作り、これを自動起動設定としてシングルトンで扱うのが良いと思います。あと、
const APP_ID = 1234567

func _ready() -> void:
    _initialize_steam()

func _initialize_steam() -> void:
    #再起動チェック
    if Steam.restartAppIfNecessary(APP_ID):
        get_tree().quit()
        return

    #初期化
    if not Steam.steamInit(APP_ID): return

    #ユーザー情報
    var username = Steam.getPersonaName()

func _process(_delta) -> void:
    Steam.run_callbacks()
restartAppIfNecessary は Steamクライアント経由で起動しているかをチェックします。もし、違うと判断したら、呼び出し元を閉じて新しく Steamクライアントから AppID 相当のアプリを再起動します。これは steamInit の前に行っても問題ないです。というか、むしろ前に行ってください。

Steam.getPersonaName() で自分のユーザー名を取得します。あまり必要ない気もしますが、こういう関数も用意されているということで。



  • 実績解除
実績解除も本当に簡単です。Steam.setAchievement(id) とするだけです。id は実績判別用のキー文字列です。この文字列は Steamworks の実績設定画面で自分で設定します。例えば「初めて起動した」という実績を解除するとしたら、キー文字列に "EXEC_1ST" 等と設定しておき、GDScript からは Steam.setAchievement("EXEC_1ST") と呼び出すだけです。

この Steam.setAchievement はローカルメモリ上でのフラグ解除処理であるため、実績解除に成功したら、サーバーに送信する必要があります。そのため、

if Steam.setAchievement("EXEC_1ST"): Steam.storeStats()
このように記載しておくのが確実です。※
※ 最新のSDKでは自動で同期するみたいなので呼び出す必要はないかもしれませんが…

あと、念の為、Steamクライアントから起動しているかをチェックすると完璧かな。

if (Steam.isSteamRunning() and Steam.setAchievement("EXEC_1ST")): Steam.storeStats()
たったこれだけで実績解除処理が作れてしまいます。



  • その他
GodotSteam を使えば、大抵の処理は実装可能になっています。

Steamクラウドファイルのアクセス
セーブデータなどを Steam のクラウドストレージに保存・読み込みできます。

Steam.fileWrite(FILE_NAME, buf, buf.size()) Steam.fileExists(FILE_NAME) var size = Steam.getFileSize(FILE_NAME) var buf = Steam.fileRead(FILE_NAME, size)
Steam Inputを使う
Steam Input API を通じてコントローラーの入力を統一的に扱えます。

Steam.inputInit(true) Steam.setInputActionManifestFilePath(manifest_abs) Steam.input_device_connected.connect(_on_controller_changed) var _handles = Steam.getConnectedControllers() var _handle = Steam.getActionSetHandle(ACTION_SET_NAME) Steam.activateActionSet(handle, _handle) var data = Steam.getDigitalActionData(_handle, action_handle)
ワールドランキング
リーダーボードへのスコア登録やランキング取得ができます。

Steam.downloadLeaderboardEntries(start_rank, end_rank, _type, _handle) Steam.uploadLeaderboardScore(_score, true, _details, _handle) Steam.getFriendPersonaName(steam_id) Steam.getPlayerAvatar(steam_id) Steam.leaderboard_find_result.connect(_on_find_result_internal) Steam.leaderboard_score_uploaded.connect(_on_score_uploaded_internal) Steam.leaderboard_scores_downloaded.connect(_on_scores_downloaded_internal)
関数名が分かればたぶん自分で調べていけますよね。また関数名と引数や戻り値を見るだけでもだいたいの動作が予測できるのが有り難いです。

役に立ちましたら是非応援の意味も込めて
Wishlist登録よろしくお願いいたします!