Steamには SteamInput というゲームパッド用の仕組みがあり、Xbox用コントローラやPS4用など、メジャーどころのゲームパッドをユーザになんの設定もなく使ってもらえる。
「なんだ最高じゃんこれヤッホー」と準備中のゲームに使おうと思ったら想像以上にハマったハマった。
数日試行錯誤の甲斐あって一応導入できそう
- SteamAPI用のサードパーティライブラリ導入
- アプリケーションのビルドをSteamにアップロードする
- VDFファイルを作成
- VDFファイルをローカルフォルダに入れる
- 設定をエクスポート
- SteamWorks で設定
- ゲームで入力を受け取る実装
- ゲームを動かして入力を受け取る
SteamAPI用のサードパーティライブラリ導入
SteamInputの利用にはSteamSDKの導入が必要であり、SDKは Unity用を提供していないと公式に バッテンついてます。
Steamworks API Overview (Steamworks Documentation)
ページ下部の Engines 参照。
ここにUnityに導入するためのサードパーティ製ライブラリのリンクが貼ってある。
二つ紹介されているが、メジャーなのは Steamworks.NET のほうっぽい。というかもう一方のほうはSteamInput対応してない?
Steamworks.NET - Steamworks.NET
導入手順は割愛。
2019/6/6 現在、SteamSDK1.43に対応して更新が止まっているように見えるがSteamInputもちゃんと使える。
アプリケーションのビルドをSteamにアップロードする
Steamからアプリケーションを起動できるようにしておく必要があるので、アプリのビルド、アップロードまでやる。
ルートディレクトリに自分のAppIDが書いてある steam_appid.txt を入れるのを忘れずに。
VDFファイルを作成
SteamInputでは アクションセット と アクション という単位で入力を受け取る。
アクションとは「ジャンプ」「キャンセル」などのゲーム内で受け取りたい入力のこと。
入力に使うコントローラがXboxだろうがPS4だろうが、 Steam側で変換して通知してくれるので、どの物理ボタンを押されたかは気にしなくていいという機能。
アクションセットはアクションの集合で、ゲーム画面、メニュー画面などで別々のアクションを定義し、切り替えて使うためのもの。
そのアクションを定義するのが in-game actions (IGA) (ゲーム内アクション)ファイル 、拡張子 vdf のJSONファイルだ。
定義方法は割愛。マニュアル見れ。
Getting Started for Developers (Steamworks Documentation)
VDFファイルをローカルフォルダに入れる
Windows利用前提 。Macは対象フォルダがわからない...
Steam本体をインストールしたフォルダに controller_config フォルダを新しく作成し、vdfファイルを配置する。
vdfファイル名は game_actions_X.vdf (XにはAppID) とする。
この状態でSteam本体を起動し、コントローラを接続。
Big Pictureモード にする。
ゲームを選択して ゲームを管理 から コントローラ設定 を選択。
接続されているコントローラが見える。
そしてVDFファイルに定義したアクションがこの時点でパッドに設定されているので、ちゃんと意図したボタンにアクションが割り当てられているか確認する。
設定をエクスポート
ハマったところその1
Steamアプリから上画像下部の「設定をエクスポート」ボタンをクリック。 新しい個人バインドを保存 する。
すると「設定を共有」ボタンが見えるようになるので、このボタンをクリック。
「設定を共有」ボタンが表示される条件が非常にわかりづらいが、一度「設定を閲覧」を選択してから個人設定リストを表示させ、エスクポートしたい設定に マウスオーバーする ことで下部にボタンが表示される。なんでこんな操作なんだ...
クリックするとリンクがコピーされた旨のダイアログが表示されるはず。
SteamWorks で設定
ここでSteamアプリを抜け、ブラウザを起動してSteamWorksに移動する。
アプリケーションの設定メニューで
アプリケーション > Steam入力
と選択してリストから カスタム設定 を選択して、Steamで共有ボタンからコピーしたURLをペーストする。
まあここは公式のページを参考にしてくだしあ。
Getting Started for Developers (Steamworks Documentation) ステップ 4 - 公開
ゲームパッドごとに割り当てたい物理ボタンが違う場合、ゲームパッドごとに設定を作りましょう。
特にXboxコンは下のボタンがAになっているので。
ゲームで入力を受け取る実装
Steamworks.net の SteamInputクラス を使って実装する。
同じようなクラスに SteamController クラスがあるが、こちらはdeplicateでSteamInputクラスに移行するということらしい。これはSteamSDKのほうでそうなっているので素直に従う。
実装は割愛。
・ハマったところその2
注意したいのは ゲームが起動してすぐコントローラ接続を検出できるわけではない ことで、
ポーリングで数秒間はコントローラ接続されていないかチェックを走らせる必用がある。
ゲームを動かして入力を受け取る
ハマったところその3
Steamからゲームを起動しないとアクションが受け取れない 状態だった。たぶんSteamOverlayの関係(?)
つまりSteamInputのテストするにはビルドしてSteamにアップロードしなければならない。。。ウーム
すぐ終わるかと思ったら近年まれにみるシンドさであった。
あ、SteamInputに対応した新作ゲーム Crazy Beat's Junction 、Steamで準備中です。