INDIE INDEX

レベル:実践

Steam Input でコントローラーに対応する手順|アクションセット・設定の公開

公開 2026-10-21更新 2026-10-21Steam(Steamworks Partner Program / Steam Direct)

Steam 入力(Steam Input)は、Steam コントローラと、システムが対応するすべてのサードパーティーのデバイスを対象にした仕組みです。ゲームの側では、アクションとアクションセットをゲーム内アクション(IGA)ファイルに書き、`ISteamInput` の関数で入力を読みます。

このページの目次
  1. 始める前に
  2. 手順の全体
  3. アクションとアクションセットを決める
  4. アクションセットレイヤー
  5. ゲームから呼ぶ関数
  6. 既定の設定を作る
  7. アクションマニフェストファイルにして公開する
  8. 情報源

始める前に

Steam 入力(Steam Input)は、Steam 入力ソフトウェアを介して入力デバイスの使用と設定を行う仕組みです。Steam Input API は、ゲームで Steam 入力デバイスの「フルサポート」を利用可能にできるようにデザインされています。

「フルサポート」にあたる、完全に対応した状態の条件は、Steam で実装が要る仕様と、あとから選べる機能の「操作の割り当て」にあります。この枚は、API を足す手順と設定の公開の手順を並べます。

従来のゲームパッドの入力と Steam Input を併せて提供することもでき、初回のローンチの後に Steam Input API を追加する場合や、複数のプラットフォームでゲームを配信する場合が、これに当たります。

手順の全体

Steam Input API のサポートの実装は、次の手順で進みます。

  1. テキストエディターで、ゲーム内アクションファイルを作成します。これで、プレイヤーがコントローラにバインドできるゲーム内アクションを Steam に伝えます。
  2. Steam で、Steam 入力コンフィギュレーター UI を使って、デフォルト設定を作成します。
  3. ゲームで Steam 入力を使用して、コントローラからアクションを読み取る際や、表示に適切なグリフを取得する際に利用します。
  4. 新しいバイナリでゲームデポを更新して、設定を公式設定として公開します。

アクションとアクションセットを決める

開発者は、アクション、アクションセット、ゲームの入力構成を構築する基本構造を定義する、ゲーム内アクション(in-game action/IGA)ファイルを提供する必要があります。

アクションセットは、異なるコントロールが必要な場所ごとに作ります。ほとんどのゲームでは、最低でも「メニュー」と「ゲーム内」のアクションセットが必要ですが、それ以上のアクションセットを必要とするゲームも多数あります。すべてが個別のアクションセットである必要はなく、アクションセットレイヤーで似たようなモードを扱うこともできます。たとえば、ゲーム内で車とボートの両方を運転できる場合は、1つの「乗り物」アクションセットを作成し、その上に「ボート」または「車」のアクションセットレイヤーを追加できます。

現時点で、アクションの最大数は、アナログが16、デジタルが128です。アクションはアクションセット間で共有でき、この制限は絶対的なものではありません。

設定ファイルの置き場

IGA ファイルは、例のファイルまたはテンプレートファイルをダウンロードして、そこから作り始められます。Steam フォルダー内に、次の名前のディレクトリを作成し、そこにファイルを保存します。

controller_config

Steam フォルダー内によく似た名前のフォルダーがあるため、次の名前のフォルダーではなく、上のディレクトリ内に保存します。

controller_base

ファイル名は game_actions_X.vdf にします。X の部分にはゲームの Steam AppID が入ります。AppID が分からないときは、Steam パートナーサイトにログインして確認できます。

各プラットフォームでの上のディレクトリの一般的な場所は、次のとおりです。

Windows  C:\Program Files (x86)\Steam\controller_config
macOS    ~/Library/Application Support/Steam/Steam.AppBundle/Steam/Contents/MacOS/controller_config
Linux    ~/.steam/steam/controller_config

ファイルは、KeyValues と呼ばれる Valve の標準形式(VDF)で書きます。キーと値の文字列をペアにして構造化オブジェクトデータを作る Valve の独自のデータ形式で、JSON ではないため、コンマや角かっこは不要です。

アクションセットと3つのブロック

ファイルの基本構造は、「In Game Actions」という名前のラッパーオブジェクトと、「actions」「localization」とそれぞれ名付けられた2つのサブオブジェクトです。

"In Game Actions"
{
    "actions"
    {
    }
    "localization"
    {
    }
}

「actions」オブジェクトにはアクションセットが入ります。各アクションセットには一意の文字列名を付け、title には「#」から始まるローカリゼーショントークンを書きます。アクションセットの名前は、Steam Input API で使う名前になります。

"actions"
{
    "ActionSetNameGoesHere"
    {
        "title" "#TitleGoesHere"
        "StickPadGyro"
        {
        }
        "AnalogTrigger"
        {
        }
        "Button"
        {
        }
    }
}

各アクションセットオブジェクトがとれるサブオブジェクトは、StickPadGyro・AnalogTrigger・Button の3つで、これらのみが定義可能なオブジェクトです。3つのカテゴリーをすべて提供する必要はなく、一部だけでも構造は完全に有効です。

StickPadGyro は、最大2つのモーション軸を持つアナログアクション用で、ジョイスティックやトラックパッド、ジャイロスコープなどへのバインドに使うアクションを入れます。マウスのようなデバイスでコントロールしたいものも該当します。AnalogTrigger は、単一のモーション軸を持つアナログアクション用で、アナログトリガーへバインドします。Button は、オン/オフ状態のみを報告する純粋なデジタルアクション用です。ブロックの名前は「Button(ボタン)」ですが、デジタルアクションはあらゆる物理的な入力にバインドできます。

AnalogTrigger と Button のアクションは、キーがアクション名、値がローカリゼーショントークンです。

"AnalogTrigger"
{
    "AccelerationAxis" "#Action_Accelerate"
    "BreakingAxis" "#Action_Brake"
}
"Button"
{
    "digital_action_1_name_here" "#DigitalAction1TitleHere"
    "digital_action_2_name_here" "#DigitalAction2TitleHere"
}

アクション名は、ゲームのコードで ISteamInput の関数を呼ぶときに、そのアクションを指す内部名として使います。

StickPadGyro のアクションは、title と、モードを示すキーを持ちます。

"actions"
{
    "FPSControls"
    {
        "title" "#Set_FPSControls"
        "StickPadGyro"
        {
            "Move"
            {
                "title" "#Action_Move"
                "input_mode" "joystick_move"
            }
            "Camera"
            {
                "title" "#Action_Camera"
                "input_mode" "absolute_mouse"
            }
        }
    }
}

このモードを示すキーは、物理的なコントロールからのデータを、Steam Input API を介してゲームに渡す前にどう解釈するかを示します。StickPadGyro のアクション用に使える値は、次の2つです。

"absolute_mouse"   アクションにマウスのような動作を期待する場合に使う
"joystick_move"    アクションでキャラクターを動かす場合に使う

Steam Input は、ゲームパッドからのジョイスティック入力を、マウススタイルの入力に変換できます。ただし、ゲーム内で適用される加速度曲線とデッドゾーンにより、その逆へは変換できません。

表示名と設定のタイトル

IGA ファイルの localization セクションには言語のリストがあり、それぞれに言語キーと値が入ります。アクションの title は、先頭に「#」を付けた言語キーを参照して名前を指定します。localization のプロパティ名は、「#」が無い点を除いて、title のローカリゼーションキーと一致します。

"localization"
{
    "english"
    {
        "Action_Jump" "Jump"
        "Action_Camera" "Camera"
    }
    "japanese"
    {
        "Action_Jump" "ジャンプ"
        "Action_Camera" "カメラ"
    }
}

各言語のトークンは API 言語コードと一致します(簡体字中国語の場合は schinese)。ゲームで使用中の言語が localization セクションに見つからない場合は、フォールバックとして英語が使われます。英語が見つからない場合は、文字列がそのまま表示されます。

設定にはローカライズされたタイトルと説明も要ります。ゲームの公式設定を1つしか作成しない場合は、Steam がデフォルトのタイトルと説明を提供するため、この手順を省略できます。複数の公式設定を作成したい場合は、ローカライズされたタイトルと説明が必要です。タイトルのキーは Title_ で、説明のキーは Description_ で始めます。

"localization"
{
    "english"
    {
        "Title_Config1" "Official Configuration"
        "Description_Config1" "This config was created by the developers of Game X."
        "Title_Config2" "Official Southpaw Configuration"
        "Description_Config2" "This config was created by the developers of Game X, and is setup for Southpaw users."
        "Action_Jump" "Jump"
        "Action_Camera" "Camera"
    }
}

設定を公開するときに、これらのローカライズされたタイトルと説明のどれを使うかを選べます。

アクションセットレイヤー

アクションセットレイヤーは、既存のコントロールのセットに任意でオーバーレイできるアクションバインドのセットです。アクションセットとは異なり、レイヤーは内部に存在するアクションセットから操作を引き出し、適用された時点ですでにアクティブなものをそっくり置き換えるのではなく、小さな変更を適用します。変更には、設定の変更のほかに、基本アクションセットへのバインドの追加と、バインドの削除が含まれます。

レイヤーは、個別のセクションで宣言します。

"action_layers"
{
    "IngameModalLayer"
    {
        "title" "#Layer_IngameModal"
        "legacy_set" "0"
        "set_layer" "1"
        "parent_set_name" "InGame"
        "AnalogTrigger"
        {
        }
        "Button"
        {
            "Modal_Accept" "#Action_Modal_Accept"
            "Modal_Decline" "#Action_Modal_Decline"
        }
    }
}

アクションセットレイヤーは、親アクションセットの設定をすべて保持します。1度に1つ以上のレイヤーを適用でき、レイヤーは連続して適用されます。同時にアクティブにできるレイヤーの数に技術的な制限はありませんが、コンフィギュレーター内にレイヤーが多すぎると、プレイヤーが混乱する可能性があります。

レイヤーの有効・無効には、次のことが決まっています。

  • すでにアクティブなアクションセットを有効にしても、そのレイヤーには影響しません。
  • 新しいアクションセットを有効にすると、古いセットからすべての有効なレイヤーが消去されます。
  • すでにアクティブなアクションセットレイヤーを有効にしても、何も変わらず、スタック内での順序も変わりません。
  • アクションセットレイヤーを無効にし、その後有効にすると、スタックの先頭に設定されます。

アクションセットレイヤーはすべてのフレームに再適用できますが、特に複数のレイヤーを使っている場合は、最後に適用されたレイヤーが既存の競合する情報を上書きするため、コード内で競合状態や、順序の入れ替えの原因となるその他の微妙なタイミングのバグが起きる可能性があります。ゲームのコードからレイヤーを扱う関数は、次の節の表にあります。

ゲームから呼ぶ関数

Steam Input API は、IGA ファイルで指定したゲーム内アクションとセットを中心に構築されています。関数は ISteamInput のメンバー関数で、グローバルのアクセサー関数経由で呼び出されます(呼び出しの形は、下のコード例のとおりです)。

ゲームのセットアップ時に、Init で Steam 入力を初期化し、GetActionSetHandle・GetDigitalActionHandle・GetAnalogActionHandle で、アクションを解決して名前をハンドルに設定します。これらのハンドルは、API の残りの部分でアクションとセットを識別するために使います。ゲームから呼ぶ主な関数には、次のようなものがあります。

関数 内容
Init ISteamInput インターフェイスの使用開始時に呼び出す必要があります。常に true を返します。
Shutdown ISteamInput インターフェイスの使用終了時に呼び出す必要があります。常に true を返します。
GetActionSetHandle アクションセットのハンドルを参照します。引数は、ゲームの VDF ファイル内で定義されたアクションセットの文字列識別子です。
GetDigitalActionHandle 指定されたデジタルアクションのハンドルを取得します。引数は、ゲームの VDF ファイル内で定義されたデジタルアクションの文字列識別子です。
GetAnalogActionHandle 指定されたアナログアクションのハンドルを取得します。引数は、ゲームの VDF ファイル内で定義されたアナログアクションの文字列識別子です。
GetConnectedControllers 現在接続されたコントローラを列挙します。handlesOut には STEAM_INPUT_MAX_COUNT サイズの InputHandle_t 配列を指定する必要があります。
ActivateActionSet 指定したアクションセット(「メニュー」「歩く」「運転」など)を使用するためにコントローラを再設定します。低コストで安全に繰り返して呼び出せます。
ActivateActionSetLayer・DeactivateActionSetLayer 指定したアクションセットレイヤーを使用するためにコントローラを再設定するか、使用を終了するために再設定します。
DeactivateAllActionSetLayers・GetActiveActionSetLayers すべてのアクションセットレイヤーの使用を終了するためにコントローラを再設定するか、現在のアクティブなすべてのアクションセットレイヤーで配列を埋めます。
GetDigitalActionData・GetAnalogActionData 提供されたデジタルまたはアナログのゲームアクションの現在の状態を返します。
RunFrame 取得できる最新のコントローラ入力と API の状態を同期します。
GetDigitalActionOrigins・GetAnalogActionOrigins originsOut に EInputActionOrigin を設定して、アクションセット内のアクションの入力元を取得します。
GetGlyphForActionOrigin 入力元に対応したグリフを画面上に表示するためのローカルパスを返します。戻り値は PNG ファイルへのパスです。
GetInputTypeForHandle 指定のコントローラの入力タイプ(デバイスモデル)を返します。
ShowBindingPanel Steam オーバーレイを呼び出し、割り当てスクリーンを表示します。

GetDigitalActionHandle と GetAnalogActionHandle は、アクションセットのハンドルを引数に受け付けません。そのため、VDF ファイル内の各アクションは一意の文字列識別子を持つ必要があります。2つの異なるアクションセット内に「up」と呼ばれるアクションを使う場合は、この関数は1つのみを返し、もう一方は無視されます。

一台のデバイスではなく、一度にすべてのコントローラを有効化したい場合は、コントローラハンドルとして定数 STEAM_INPUT_HANDLE_ALL_CONTROLLERS を使います。個々のコントローラハンドルを呼び出す他の関数でも、この値を使えます。

void updateStateLoop() {
    switch( currentState ) {
        case MENU:
            SteamInput()->ActivateActionSet( inputHandle1, menuSetHandle );
            doMenuStuff();
            break;
        case WALKING:
            SteamInput()->ActivateActionSet( inputHandle1, walkingSetHandle );
            doWalkingStuff();
            break;
    }
}

入力は、GetDigitalActionData と GetAnalogActionData で読み取ります。RunFrame は SteamAPI_RunCallbacks で自動的に実行されますが、可能な限り絶対的に最低のレイテンシーが必要な場合は、コントローラの状態を読み出す前に直接呼び出せます。バージョンセーフインターフェイスを有効にしていて、適切なポーリングデータが得られない場合は、フレームごとに RunFrame を呼び出す必要があります。デジタルアクションでは、返るデータの bState が、アクションがコントローラから送信されていれば true になります(ボタンを押したとき、トリガーを引いたときなど)。アナログアクションでは、返るデータの x と y が、IGA ファイルでゲームアクションを割り当てたモードに依存します。モードごとの x と y は、次のとおりです。

"absolute_mouse"   x と y は、以前のマウス位置からのデルタ
"joystick_move"    x と y は、-1 から 1 の間の値で、現在のジョイスティックの位置

コントローラのプロンプトを画面に表示するには、ゲーム内アクションにバインドされている物理的な入力ソースを取得します。プレイヤーは1つのアクションに複数の物理的な入力ソースをバインドする場合があります。GetDigitalActionOrigins と GetAnalogActionOrigins は、指定されたアクションの入力ソースの数を返し、渡された originsOut 配列を埋めます。originsOut は STEAM_INPUT_MAX_ORIGINS サイズの配列です。ユーザーはいつでも設定を変更でき、この2つの関数は非常に低コストで呼び出せます。

GetGlyphForActionOrigin が返すのは、Steam クライアントのインストールフォルダー内にある Valve の公式画像セットのうち、入力元に対応するグリフのファイルへのパスです。PlayStation コントローラーには PlayStation ボタンが、Xbox コントローラーには Xbox ボタンが表示されます。Valve が新しいハードウェアのサポートを追加すると、この関数は更新されたグリフを自動的に取得するため、新しいグリフアセットでゲームを再コンパイルする必要はありません。

ShowBindingPanel は、成功した場合は true、オーバーレイが無効化されているか使用できない場合は false を返します。プレイヤーが Big Picture モードを使用している場合、設定はオーバーレイ内で開きます。デスクトップモードでは、ウィンドウとして Big Picture のポップアップバージョンが作られ、設定が開きます。

画面上のテキスト入力は、ISteamInput ではなく ISteamUtils に属します。ShowGamepadTextInput・GetEnteredGamepadTextLength・GetEnteredGamepadTextInput などがあり、Steam 入力を使用するかどうかにかかわらず、役に立つ場合があります。

Steam 入力は、コントローラが実行するマッピングを決めるためのアプリごとのマッピングを提供し、Steam は前景ウィンドウを追跡します。そのため、デバッガーでブレークポイントで止まったときにコントローラの設定が変更され、作業中にコントローラをデバッグするのが難しくなる場合があります。デバッグ用に Steam をウィンドウにロックする方法は2つあります。1つ目は、Steam URL steam://forceinputappid/<ゲームの AppID> を実行する方法で、通常の操作にリセットする場合は AppID の代わりに 0 を入力します。2つ目は、Steam ショートカットにコマンドラインパラメーター -forcecontrollerappid <ゲームの AppID> を追加する方法です。「Steam ショートカット」とは Steam クライアントへのショートカットを意味し、コマンドラインパラメーターが渡されるのはゲームではなく Steam クライアントです。

既定の設定を作る

IGA ファイルを作成し、それが正しいディレクトリにあり、ゲームの AppID に一致する名前が付いていることを確認したら、設定を作成できます。

  1. Big Picture モードで Steam を実行し、自分のゲームのゲーム詳細ページを開きます。
  2. 「ゲームを管理」、それから「コントローラ設定」を選択します。エラーが表示された場合は、IGA ファイル内に修正が必要な問題があります。最も一般的なミスは、閉じ引用符や中括弧の欠落です。エラーが表示されない場合は、ゲームのコントローラ設定が空の状態で、すべてのゲーム内アクションが認識されているはずです。
  3. UI を使ってデフォルト設定を作成します。最初のアクションセットだけでなく、すべてのゲーム内アクションセット用に設定します。
  4. 設定を作成したら、非公開で保存します。ゲームはまだ IGA を受け取る準備ができていないため、ここでは公開しません。

アクションマニフェストファイルにして公開する

アクションマニフェストファイルは IGA ファイルの拡張で、タイプ別に分類された公式設定のリストを含む追加のセクションを持ちます。アクションとローカリゼーションのセクションは、IGA ファイルと同じです。

"Action Manifest"
{
    "configurations"
    {
    }
    "actions"
    {
    }
    "localization"
    {
    }
}

アクションマニフェストファイルを編集する前に、Steam Input で開発者モードを有効にします。これにより、開発者として設定をエクスポートでき、アクションマニフェストを編集する際に間違いがあった場合に、エラーメッセージを受け取ることができます。「Steam Big Picture モード」>「設定」>「システム」に移動して Steam の開発モードを有効にし、開発者セクションで「Steam入力レイアウト開発者モード」を有効にします。

既存の IGA ファイルがある場合は、コントローラ設定画面で現在の設定を保存できます。ギアアイコンを選択し、「レイアウトをエクスポート」を選択して、ゲーム用にタイトルと説明を選択して設定をエクスポートします。

次に、次の Steam URL の [your app id] をアプリの AppID に置き換えて実行すると、各 OS のドキュメントフォルダー内(Windows の場合はマイドキュメント)に設定がダンプされます。Windows のコマンドラインでは start steam://dumpcontrollerconfig?appid=[your app id] を実行します。SteamOS デバイスでは、開発キットツールで Get Controller Config コマンドを使います。Linux のコマンドラインでは xdg-open steam://dumpcontrollerconfig?appid=[your app id] を実行し、SteamOS デバイスではデスクトップモードが必要です。Linux のコマンドは .vdf ファイルを /tmp に書き出します。設定ファイルと既存の IGA ファイルは、ゲームフォルダー内の希望する場所にコピーします。

IGA ファイルをアクションマニフェストに変換するには、ファイルを編集して、エクスポートしたコントローラ設定のリストを含む configurations セクションを追加します。コントローラのタイプごとに設定をリストし、次にロードの優先順にリストします。path の値は、アクションマニフェストファイルのディスク上の場所からの相対でリストします。

"configurations"
{
    "controller_xboxone"
    {
        "0"
        {
            "path" "xbox_controller.vdf"
        }
    }
    "controller_steamcontroller_gordon"
    {
        "0"
        {
            "path" "steam_controller.vdf"
        }
        "1"
        {
            "path" "steam_controller_motion_controls.vdf"
        }
    }
}

コントローラタイプの文字列には、たとえば次のものがあります。

controller_neptune                 Steam Deck コントローラ
controller_steamcontroller_gordon  Steam コントローラ
controller_xboxone                 Xbox One
controller_ps4                     PlayStation 4 コントローラー
controller_ps5                     DualSense コントローラー

通常のプレイヤーの構成と設定を公開するには、パートナーサイトの設定を行います。

  1. Steamworks パートナー Web サイトでゲームのページを開き、「アプリケーション」タブから「Steam入力」を選択します。
  2. 「Steam入力デフォルト設定」というセクションまでスクロールし、ドロップダウンで「カスタム設定(ゲームにバンドル)」オプションを選択します。ネイティブサポートを追加する予定がなく、一般的なレガシーモードのプリセットから選択したい場合は、ここで設定します。
  3. 下のテキストボックスに、ゲームのインストールフォルダー内のアクションマニフェストファイル(VDF)への相対パスを入力します。
  4. Steam 入力を使用するコントローラの種類を設定します。Steam 入力 API を使用している場合は、「将来のデバイス」オプションにチェックを入れると、Steam が新しいコントローラのサポートを開始したときに、ゲーム側で設定を変更しなくても、デフォルトで動作するようになります。チェックを入れたコントローラタイプは、標準のゲームパッド入力プロトコルではなく、Steam 入力を使用するようになります。
  5. ページの下部にある「保存」を選択して、通常どおりパートナーサイトでアプリの変更を公開します。

ゲームを Steam 経由で実行すると、アクションマニフェストファイルはゲームのデポから自動的に取得されます。IDE 経由で実行していて、ゲームがインストールされている場合も、Steam はお使いの Steam デポのアクションマニフェストファイルを使います。Steam にゲームがインストールされていない状態で実行している場合や、ローカルで変更を加える必要がある場合は、SetInputActionManifestFilePath を呼び出してアクションマニフェストのパスを上書きできます。このオーバーライドは、Steam セッションが終わるまで保持されます。

Steam Deck での互換性の確認はSteam Deck のタグ表示に、Deck 向けの入力の項目はSteam Deck 向けの実装にあります。ツールの全体像はSteamworks SDKにあります。

情報源

Steam 完全ガイドを順番に読む60本のうち44本目

このページに出た言葉

このページの内容の誤りは、問い合わせの窓口で受け付けています。