おもちゃラボ

Unityで遊びを作っていきます

【Unity】Input Managerの使い方まとめ。PS3やPS4のコントローラの入力を取得しよう

ゲームを作った場合、PS3やPS4などのコントローラ(その他ゲームパッド)を使って検証したいことがあります。ここではUnityでPS3のコントローラの入力を取る方法を紹介します。コントローラとPCはUSBで接続しておきましょう(Bluetoothでも大丈夫です)

ワイヤレスコントローラー(DUALSHOCK 4) ジェット・ブラック(CUH-ZCT2J)

ワイヤレスコントローラー(DUALSHOCK 4) ジェット・ブラック(CUH-ZCT2J)

今回の記事の内容は次のようになります。

手っ取り早くコントローラの入力を取る

まずは一番簡単な方法から紹介します。普通にコントローラのキーが押されたかを調べるだけであれば、次のコードだけで十分です。

// 左十字キーが押された場合
Input.GetButtonDown("joystick button 7");

マウスやキー入力とほぼ同じコードでPS3/4のコントローラ入力を取得出来るのがわかりますね。引数にはコントローラに割り振られたボタン番号を渡します。

PS3/4のコントローラのボタン番号は、Unity Asset Storeで配布されている「Controller Tester」というアセットで簡単に調べられます。

このアセットをインポートして、「Controller Tester」→「Scene」→「Controller Test」のシーンを開いて下さい。ゲームを実行すると次のような画面が表示されるので、コントローラのボタンを押すと、対応するボタン番号のところの表示が変化します。

f:id:nn_hokuson:20171120200246g:plain

ちなみに・・・手元にあるPS3のコントローラでは次のような割当になっていました。

f:id:nn_hokuson:20171120202638j:plain:w350

Input Managerを使ってコントローラの入力を取得する

とりあえず、Input.GetButton系のメソッドを使うことで、簡単にPS3やPS4のコントローラの入力が取れることはわかりました。

ただ、デバッグのときにはキーボードのASWDキーでプレイヤを動かしたいのだけど・・・となると入力部分を全てif文で分けるか置換するか・・・これは考えたくないですね(笑)

そこで、Input Managerの登場です。Input Managerは簡単に言えばキー入力やゲームパッドの入力、タッチパネルからの入力などに名前をつける仕組みです。そして、スクリプト側ではその名前を使って入力を取得します。

f:id:nn_hokuson:20171120224625j:plain:w450

つまり、入力デバイスとスクリプトの間にInput Managerというレイヤを一層噛ますことで、異なる入力でも同じ名前で扱うことが出来るようになるのです。

ここではPS3コントローラの左十字キーと、キーボードのAキーに「Left」という名前をつけてみましょう。

Unityのメニューバーから「Edit」→「Project Settings」→「Input」を選択し、インスペクタを開いて下さい。次のように入力が並んでいるのでSizeの欄の値を一つ増やして「19」と入力し、エンターを押して下さい。

f:id:nn_hokuson:20171120224645j:plain:w300

一番下に新たな入力(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」が戻ってきます。

docs.unity3d.com

まとめ

InputManagerの使い方を紹介しました。InputManagerを使うことで、入力デバイスとスクリプトの間にレイヤを一層噛ますことができ、異なる入力でも同じ名前で扱うことが出来ました。

Unityの教科書 Unity 2017完全対応版  2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)

Unityの教科書 Unity 2017完全対応版 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)