Unityでゲームパッドからの入力したいからまとめてみる(XBox One Controller)
はじめに
アクションゲームの設計段階なのに気持ちが先行してコントローラを購入。
— はこね (@hakone_san) April 14, 2018
PCゲームは箱コンがいいと聞きました。 pic.twitter.com/QVmEaO9uFk
...そんなわけで購入しました。
おそらくInput.GetButtonとかInput.GetAxisとかで入力できると思いますが、 入力方法を確かめておこうと思います。
今回の目標
ゲームパッドからUnityに入力できるようになる。
環境
- マイクロソフト ゲームコントローラー 4N6-00003 http://amzn.asia/dyUPVMK
- WIndows10 64bit
- Unity 2017.3.1f1
macの場合はまた異なる設定が必要みたいです。 この記事ではWin10の場合のみです。
結果
できました。
Xbox One Controller (Windows10)
Positive Button | XBox One | 対応 |
---|---|---|
joystick button 0 | A | A |
joystick button 1 | B | B |
joystick button 2 | X | X |
joystick button 3 | Y | Y |
joystick button 4 | LB | 2 |
joystick button 5 | RB | 7 |
joystick button 6 | View | 3 |
joystick button 7 | Menu | 6 |
joystick button 8 | L Stick (押し込み) | 1 |
X-Axis/Y-Axis | L Stick (H/V) | 1 |
joystick button 9 | R Stick (押し込み) | 10 |
4th-Axis/5th-Axis | R Stick (H/V) | 10 |
6th-Axis/7th-Axis | D-PAd (H/V) | 8 |
3rd-Axis | Trigger(L/R) | 11,14 |
絵はこちらから support.xbox.com
以下は動作確認の記録です。
Xbox Oneコントローラのキーの名前の確認
まずはマニュアルの確認。
任意のジョイスティックボタンは"joystick button 0"とかで指定できるみたい。 docs.unity3d.com
入力の確認をしてみる。
スティックやRTなど、Input.GetButtonで取得できなさそうなボタンを除くと 10個あったので、"joystick button 9"まで確認してみます。 HorizontalとVerticalも合わせて確認。
ボタン確認に使用したコード
using System.Collections.Generic; using UnityEngine; public class inputDemo : MonoBehaviour { // Update is called once per frame void Update () { if (Input.GetKeyDown ("joystick button 0")) { Debug.Log ("button0"); } if (Input.GetKeyDown ("joystick button 1")) { Debug.Log ("button1"); } if (Input.GetKeyDown ("joystick button 2")) { Debug.Log ("button2"); } if (Input.GetKeyDown ("joystick button 3")) { Debug.Log ("button3"); } if (Input.GetKeyDown ("joystick button 4")) { Debug.Log ("button4"); } if (Input.GetKeyDown ("joystick button 5")) { Debug.Log ("button5"); } if (Input.GetKeyDown ("joystick button 6")) { Debug.Log ("button6"); } if (Input.GetKeyDown ("joystick button 7")) { Debug.Log ("button7"); } if (Input.GetKeyDown ("joystick button 8")) { Debug.Log ("button8"); } if (Input.GetKeyDown ("joystick button 9")) { Debug.Log ("button9"); } float hori = Input.GetAxis ("Horizontal"); float vert = Input.GetAxis ("Vertical"); if(( hori != 0) || (vert != 0) ){ Debug.Log ("stick:"+hori+","+vert ); } } }
ここまででできなかったこと。
StickとD-PadとLT,RTが見つからない!!!
マニュアルによると、プロパティ設定が必要みたいです。
Input Managerで入力設定
そんなわけでInput Managerを起動。
Edit→Project Settings→Input
デフォルトで18個設定されているようです。(Sizeの値)
先ほどR Stickの入力で使用したHorizontalはこんな設定になっていました。 ※TypeがKey or Mouse Buttonなので、こちらはJoystickのものではないです。
先ほどR Stickの入力で使用したHorizontalはこんな設定になっていました。
L Stick(H/V) , R Stick(H/V) , D-Pad十字(H/V) ,左右トリガ()を新たに設定するため、 7つ設定を追加します。
Sizeを26にして、Nameを変更します。
各種property
L Stick
R Stick
D-Pad
なぜかD-Padだけ上下が逆? よくわかんないけど環境によって異なるのかな。
Trigger
ちょっと特殊でした。 正の値と負の値でRとLが使われていました。
Stick,Dpad,Trigger確認に使用したコード
using System.Collections; using System.Collections.Generic; using UnityEngine; public class inputDemo : MonoBehaviour { // Update is called once per frame void Update () { //L Stick float lsh = Input.GetAxis ("L_Stick_H"); float lsv = Input.GetAxis ("L_Stick_V"); if(( lsh != 0) || (lsv != 0 )){ Debug.Log ("L stick:"+lsh+","+lsv ); } //R Stick float rsh = Input.GetAxis ("R_Stick_H"); float rsv = Input.GetAxis ("R_Stick_V"); if(( rsh != 0 ) || (rsv != 0 )){ Debug.Log ("R stick:"+rsh+","+rsv ); } //D-Pad float dph = Input.GetAxis ("D_Pad_H"); float dpv = Input.GetAxis ("D_Pad_V"); if(( dph != 0 ) || ( dpv != 0 )){ Debug.Log ("D Pad:"+dph+","+dpv ); } //Trigger float tri = Input.GetAxis ("L_R_Trigger"); if( tri > 0 ){ Debug.Log ("L trigger:"+tri ); }else if( tri < 0 ){ Debug.Log ("R trigger:"+tri ); }else{ Debug.Log (" trigger:none" ); } } }
補足
マニュアルより、プロパティはこんな感じです。 stickやtriggerからの入力が0,1しかできないとかはここで調整します。
property | 説明 |
---|---|
Name | 入力軸の名前。 |
Descriptive Name | スタンドアロンビルドで 設定 ダイアログ の Input タブで表示される正の値の名前。 |
Descriptive Negative Name | スタンドアロンビルドで 設定 ダイアログ の Input タブで表示される負の値の名前。 |
Negative Button | 軸を負の方向に押すためのボタン。 |
Positive Button | 軸を正の方向に押すためのボタン。 |
Alt Negative Button | 軸を負の方向に押すための代わりのボタン。 |
Alt Positive Button | 軸を正の方向に押すための代わりのボタン。 |
Gravity | 何もボタンが押されてない場合に軸がニュートラルになるための秒速。 |
Dead | 絶対値がこの数値未満の場合は 0 として処理されます。ジョイスティックに便利です。 |
Sensitivity | 軸がターゲットの値に向かうための秒速。これはデジタルデバイスにのみ向いています。 |
Snap | これを有効化すると、軸の値は、ボタンを反対方向に押したときに、0 にリセットされます。 |
Invert | これを有効化すると、Negative Buttons は正の値に反転し、Positive Buttons は負の値に反転します。 |
Type | 軸を制御する入力の種類。 |
Axis | 軸を制御するために接続されたデバイスの軸。 |
Joy Num | 軸を制御する接続されたジョイスティックの数。 |
おわりに
joystick button 0とかもInputManagerで名前を付けたほうが使いやすそうですね。
triggerの同時押しの場合はいまだにわかっていません。
同時に押したら値は0になる?
いろいろ検証してみないとですね。
箱コンかっこいい....