質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

3361閲覧

[Unity]接続されているコントローラーの種類を取得したい

minokiti

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/01/22 09:50

編集2022/01/22 22:21

実現したいこと

Unityで接続されているコントローラーの種類(DUALSHOCK4、Xboxなど)をスクリプトから取得したいと思っています。

発生している問題

Input.GetJoystickNames()でコントローラーの名前の配列を取得しているのですが、それぞれのPCでコントローラーに登録している名前が違うため、困っています。

ソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Slot : MonoBehaviour 6{ 7 8 public bool connected = false; 9 public string controller_name; 10 11 private float scroll; 12 public string[] controllerNames; 13 14 void Update() 15 { 16 // 接続されているコントローラの名前を調べる 17 controllerNames = Input.GetJoystickNames(); 18 19 // 一台もコントローラが接続されていなければログを吐く 20 if (controllerNames.Length == 0) 21 { 22 connected = false; 23 Debug.Log("Not Connected."); 24 } 25 else 26 { 27 connected = true; 28 controller_name = controllerNames[0]; 29 } 30 31 if (connected) 32 { 33 if (controllerNames[0].Contains("DUALSHOCK4")) 34 { 35 //PS4コントローラー 36 if (Input.GetKeyDown("joystick button 5")) 37 { 38 //R1ボタン 39 if (item_n < 5) 40 item_n ++; 41 } 42 if (Input.GetKeyDown("joystick button 4")) 43 { 44 //L1ボタン 45 if (item_n > 1) 46 item_n --; 47 } 48 } 49 } 50} 51

補足情報(FW/ツールのバージョンなど)

Unity2021.2.4f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2022/02/28 10:10

何に困っているのかよくわからないのですが、「コントローラーの名前」が環境によって違うということでしょうか。 それとも、コントローラーによってボタン等のレイアウトが違うということが問題なのでしょうか。
minokiti

2022/02/28 13:35

コントローラーの名前が環境によって違うので困っています。
guest

回答1

0

Unity からは OS から知らされる名前しかわからないので、OS に直接アクセスして他の情報を取ってきて判断する仕組みを自分で作らないといけないですね。例えば以下のようにすると「メーカー (manufacturer)」が取れるのでそれで判断できるかもしれません。Unity から取れる名前と関連付けて、メーカーを知るということができるはずです。非常に面倒ですが。

以下のコードは Unity から直接は実行できません。このような OS の情報を取得するプログラムをクラスライブラリの dll として作り、それをネイティブプラグインとして Unity から呼べば、Unity からできること以上のことができます。

csharp

1using System; 2using System.Management; 3 4class Program 5{ 6 static void Main(string[] args) 7 { 8 ManagementClass controllerDevices = new ManagementClass("Win32_PnPEntity"); 9 string[] properties = { "Caption", "Description", "Name", "Manufacturer" }; 10 11 foreach (var d in controllerDevices.GetInstances()) 12 { 13 Console.WriteLine("=========="); 14 15 foreach (var p in properties) 16 { 17 var v = d.GetPropertyValue(p); 18 Console.WriteLine($"{p}: {v}"); 19 } 20 } 21 22 Console.WriteLine("Hit Enter..."); 23 Console.ReadLine(); 24 } 25}

text

1(前略) 2Description: WAN Miniport (PPTP) 3Name: WAN Miniport (PPTP) 4Manufacturer: Microsoft 5========== 6Caption: Xbox 360 Controller for Windows 7Description: Xbox 360 Controller for Windows 8Name: Xbox 360 Controller for Windows 9Manufacturer: Microsoft 10========== 11Caption: Volume 12Description: Volume 13Name: Volume 14Manufacturer: Microsoft 15(略)

投稿2022/02/28 15:43

bboydaisuke

総合スコア5339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問