はこねのはこ

はこねさんの備忘録

Unityでゲームパッドからの入力したいからまとめてみる(XBox One Controller)

はじめに

...そんなわけで購入しました。

おそらくInput.GetButtonとかInput.GetAxisとかで入力できると思いますが、 入力方法を確かめておこうと思います。

今回の目標

ゲームパッドからUnityに入力できるようになる。

環境

macの場合はまた異なる設定が必要みたいです。 この記事ではWin10の場合のみです。

結果

できました。

Xbox One Controller (Windows10)

f:id:hakonebox:20180415100521p:plain

f:id:hakonebox:20180415124345p:plain

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が見つからない!!!

f:id:hakonebox:20180415110922p:plain

マニュアルによると、プロパティ設定が必要みたいです。

Input Managerで入力設定

そんなわけでInput Managerを起動。

Edit→Project Settings→Input

f:id:hakonebox:20180415111229p:plain

デフォルトで18個設定されているようです。(Sizeの値)

先ほどR Stickの入力で使用したHorizontalはこんな設定になっていました。 ※TypeがKey or Mouse Buttonなので、こちらはJoystickのものではないです。

f:id:hakonebox:20180415111546p:plain

先ほどR Stickの入力で使用したHorizontalはこんな設定になっていました。

L Stick(H/V) , R Stick(H/V) , D-Pad十字(H/V) ,左右トリガ()を新たに設定するため、 7つ設定を追加します。

Sizeを26にして、Nameを変更します。

f:id:hakonebox:20180415114850p:plain

各種property

L Stick

f:id:hakonebox:20180415122425p:plain

R Stick

f:id:hakonebox:20180415122444p:plain

D-Pad

なぜかD-Padだけ上下が逆? よくわかんないけど環境によって異なるのかな。

f:id:hakonebox:20180415122620p:plain

Trigger

ちょっと特殊でした。 正の値と負の値でRとLが使われていました。 f:id:hakonebox:20180415122638p:plain

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になる?

いろいろ検証してみないとですね。

箱コンかっこいい....

f:id:hakonebox:20180415125441j:plain

参考にさせていただいたサイト

nn-hokuson.hatenablog.com

littlewing.hatenablog.com

nezil.blog.fc2.com