(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


ゲームパッド(コントローラー)の接続/切断や、現在のゲームパッドの種類を取得する方法【Unity】【Input System】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2022.3.21f1
Input System 1.7.0


はじめに

今回はUnityの公式機能であるInput Systemで、

ゲームパッド(コントローラー)の接続/切断や、現在のゲームパッドの種類を取得する方法の紹介です!


なお、Input Systemの導入や基本的な使い方は以下の記事を参照の事。





UnityのInput Systemで現在のゲームパッドの種類を取得する方法

まず、デバイスの接続/切断はInputSystem.onDeviceChangeで取得出来ます。



具体的なコードだと以下のような感じに。

private void OnEnable(){
  //デバイスの接続/切断のイベントに処理登録
  InputSystem.onDeviceChange += OnDeviceChange;
}

private void OnDisable(){
  //デバイスの接続/切断のイベントの処理解除
  InputSystem.onDeviceChange -= OnDeviceChange;
}

///デバイスの変更があった
private void OnDeviceChange(InputDevice device, InputDeviceChange change){
  if (device is Gamepad){//デバイスがゲームパッド(コントローラー)の時だけ処理
    switch (change){
      case InputDeviceChange.Added:
        Debug.Log($"コントローラー接続: {device.displayName}");
        break;
      case InputDeviceChange.Removed:
        Debug.Log($"コントローラー切断: {device.displayName}");
        break;
    }
  }
}


ただし、ゲーム起動時に最初から繋がっている場合はonDeviceChangeでは取得できません。

なので、最初にInputSystem.devicesから繋がっている全デバイスを取得し、

ゲームパッドが繋がっているかあるいは繋がっていないを確認すると良いかと思います。

private void Start(){
  // 全デバイスを取得
  var devices = InputSystem.devices;

  foreach (var device in devices){
    if (device is Gamepad){//デバイスがゲームパッド(コントローラー)の時だけ処理
      Gamepad gamepad = device as Gamepad;
      Debug.Log($"コントローラー検出: {gamepad.displayName}");
    }
  }
}


なお、ゲームパッドごとにボタンの出し分けをしたいなど、

種類を判定する時は名前に含まれている文字列でチェックする感じです。

var deviceName = gamepad.displayName.ToLower();

if (deviceName.Contains("xbox")){
  /*Xbox系のコントローラー検出*/
}
else if (deviceName.Contains("playstation") || deviceName.Contains("dualshock") || deviceName.Contains("dual sense") || deviceName.Contains("dualsense")){
  /*PlayStation系のコントローラー検出*/
}
else if (deviceName.Contains("switch") || deviceName.Contains("joycon") || deviceName.Contains("pro controller")){
  /*Switch系のコントローラー検出*/
}
else {
  /*その他のコントローラー検出*/
}