TorqueL(トルクル) Windows版における入力デバイス検知の実装について

本記事はQiita投稿記事「TorqueL(トルクル) Windows版における入力デバイス検知の実装について - Qiita」を転記したものです。投稿日はQiitaでの初投稿日に合わせています。

TorqueLWindows版では入力デバイスがキーボードがゲームパッド(ジョイスティック)かで一部の画面表示を動的に切り替える仕組みを入れています。 この記事は「入力デバイスをどのように検知しているか」の説明です。

f:id:nanmo:20200330141529g:plain

まとめ

Unity 4.3のInputManager経由の入力は使わず、publicのenumでデバイスを仮想的に定義(InputDevice)し、KeyCodeから判断するように実装しています。 (※軸/Axis系はInputManger経由でしか取れなかったのでそのまま)

以下、仮想コード

public class hogeinput : MonoBehaviour {
    public enum InputDevice {None, Keyboard, Mouse, Joystick, Unknown};
    public static InputDevice LastInputDevice { get{return lastInputDevice;} }
    static void detectInputDevice( KeyCode kc) {
        int keycode = (int)kc;
        if ( keycode == 0 ) {
            //None
            lastInputDevice = InputDevice.None;
        }
        else if ( keycode >= 8 && keycode <= 319 ) {
            //Keyboard (8=Backspace, 319=Menu)
            lastInputDevice = InputDevice.Keyboard;
        }
        else if ( keycode >= 323 && keycode <= 329 ) {
            //Mouse Button 0-6
            lastInputDevice = InputDevice.Mouse;
        }
        else if ( keycode >= 330 && keycode <= 429 ) {
            //Joystick Button
            //ex:joystick 330-349, joystick1 350-369, joystick2 370-389, joystick3 390-409, joystick4 410-429
            lastInputDevice = InputDevice.Joystick;
        }
        else {
            //Unknown
            lastInputDevice = InputDevice.Unknown;
        }
    }
}

キーコードの詳細は http://docs.unity3d.com/jp/current/ScriptReference/KeyCode.html を参照のこと。

製品で動いてる実装では同じクラス内に独自実装したボタン割り当てとボタン入力受付関数からdetectInputDevideを毎回呼ぶようにして、Updateで入力デバイスをチェックしつつもうひとつ前のlastInputDeviceを保持する変数を用意して入力デバイスが切り替わったことが検知できるようにしていたりします。 (ボタンの割当周りの実装については別記事予定)

上の実装だとキーボードかゲームパッドかぐらいしか検知していませんので、例えば「360のパッドとDUALSHOCK4で自動的に分けられるようにしたい」という時はInput.GetJoystickNames()で入力のあったジョイスティックのデバイス名(デバイスとプリンターで表示されてる名前)をチェックするようにするといいんじゃないかと思います(ただあまり現実的じゃないかも)