本記事の内容をはてなブログに転記しました。
すぐにQiitaの記事を削除する予定はありませんが、どちらか一方だけ残すとなったらはてなブログの方を残すと思います。
ご承知おき下さい。
TorqueLのWindows版では入力デバイスがキーボードがゲームパッド(ジョイスティック)かで一部の画面表示を動的に切り替える仕組みを入れています。
この記事は「入力デバイスをどのように検知しているか」の説明です。
まとめ
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()で入力のあったジョイスティックのデバイス名(デバイスとプリンターで表示されてる名前)をチェックするようにするといいんじゃないかと思います(ただあまり現実的じゃないかも)