ゲームを作った場合、PS3やPS4などのコントローラ(その他ゲームパッド)を使って検証したいことがあります。ここではUnityでPS3のコントローラの入力を取る方法を紹介します。コントローラとPCはUSBで接続しておきましょう(Bluetoothでも大丈夫です)
今回の記事の内容は次のようになります。
手っ取り早くコントローラの入力を取る
まずは一番簡単な方法から紹介します。普通にコントローラのキーが押されたかを調べるだけであれば、次のコードだけで十分です。
// 左十字キーが押された場合 Input.GetButtonDown("joystick button 7");
マウスやキー入力とほぼ同じコードでPS3/4のコントローラ入力を取得出来るのがわかりますね。引数にはコントローラに割り振られたボタン番号を渡します。
PS3/4のコントローラのボタン番号は、Unity Asset Storeで配布されている「Controller Tester」というアセットで簡単に調べられます。
このアセットをインポートして、「Controller Tester」→「Scene」→「Controller Test」のシーンを開いて下さい。ゲームを実行すると次のような画面が表示されるので、コントローラのボタンを押すと、対応するボタン番号のところの表示が変化します。
ちなみに・・・手元にあるPS3のコントローラでは次のような割当になっていました。
Input Managerを使ってコントローラの入力を取得する
とりあえず、Input.GetButton系のメソッドを使うことで、簡単にPS3やPS4のコントローラの入力が取れることはわかりました。
ただ、デバッグのときにはキーボードのASWDキーでプレイヤを動かしたいのだけど・・・となると入力部分を全てif文で分けるか置換するか・・・これは考えたくないですね(笑)
そこで、Input Managerの登場です。Input Managerは簡単に言えばキー入力やゲームパッドの入力、タッチパネルからの入力などに名前をつける仕組みです。そして、スクリプト側ではその名前を使って入力を取得します。
つまり、入力デバイスとスクリプトの間にInput Managerというレイヤを一層噛ますことで、異なる入力でも同じ名前で扱うことが出来るようになるのです。
ここではPS3コントローラの左十字キーと、キーボードのAキーに「Left」という名前をつけてみましょう。
Unityのメニューバーから「Edit」→「Project Settings」→「Input」を選択し、インスペクタを開いて下さい。次のように入力が並んでいるのでSizeの欄の値を一つ増やして「19」と入力し、エンターを押して下さい。
一番下に新たな入力(Cancel)が複製されるので、次のように設定して下さい。
項目名 | 値 |
---|---|
Name | Left |
Positive Button | joystick button 7 |
Alt Positive Button | a |
Type | Key or Mouse Button |
これでPS3の左十字キー(joystic button 7)とAキーに「Left」という名前をつけることができました。
最後にスクリプトで次のように記述することで左十字キーが押されたときとAキーが押されたとき、いずれも「Left Key Pressed」という文字が表示されます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { void Update () { if(Input.GetButtonDown("Left")){ Debug.Log("Left Key Pressed"); } } }
アナログスティックの値を取得する
アナログスティックの値も、ボタン入力とほぼ同じ方法で取得することができます。アナログスティックに関してはもともと用意されている「Horizontal」と「Vertical」の値を流用しましょう。
項目名 | 値 |
---|---|
Name | Horizontal |
Type | Joystick Axis |
Axis | X Axis |
Joy Num | Get Motion from all Joysticks |
項目名 | 値 |
---|---|
Name | Vertical |
Type | Joystick Axis |
Axis | Y Axis |
Joy Num | Get Motion from all Joysticks |
アナログスティックからの入力はGetAxisメソッドを使って取得できます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { void Update () { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); Debug.Log(h+","+v); } }
アナログスティックを左に倒したときはGetAxisメソッドの戻り値は「-1」になり、アナログスティックを右に倒したときの戻り値は「1」になります。通常の状態では「0」が戻ってきます。
まとめ
InputManagerの使い方を紹介しました。InputManagerを使うことで、入力デバイスとスクリプトの間にレイヤを一層噛ますことができ、異なる入力でも同じ名前で扱うことが出来ました。