Input.GetAxisとInputManagerの関連設定について

# はじめに

　Unityを最初に触った時のことを覚えていますか？

　私は入門書のサンプルのコードを写経して、ちょこちょこパラメータをいじったり、配置するオブジェクトを増やしたりしたのを覚えています。Input.GetAxisメソッドを使って板を傾けて、その板の上に置いた球を転がして遊ぶゲームなどを作ったと思います。たった少しの手順を踏むだけで遊べるものができたことにとても感動しました。

　さて、この投稿では[Input.GetAxis](http://docs.unity3d.com/ScriptReference/Input.GetAxis.html)メソッドと、それに関係があるInput.Managerの設定について説明します。

　スクリプトリファレンスの情報とInputManagerの[こちら](http://docs.unity3d.com/Manual/ConventionalGameInput.html)の解説をまとめたもの、[こちら](http://unity3d.com/learn/tutorials/modules/beginner/scripting/get-axis)のUnityのチュートリアル動画GetAxisの解説を文字に起こした内容です。

# どう使う？

　Input.GetAxisのメソッドを使ったサンプルです。

```csharp:Input.GetAxisメソッドのサンプル
using UnityEngine;

public class HelloInputGetAxis : MonoBehaviour
{
	void Update ()
	{
		float dx = Input.GetAxis ("Horizontal");
		float dy = Input.GetAxis ("Vertical");
		transform.Translate (dx, dy, 0.0F);
	}
}
```

　このHelloInputGetAxisが付与されたGameObjectは、キーなどの入力により動きます。

# Input.GetButtonとかInput.GetKeyとかと、Input.GetAxisは何が違う？

* [InputクラスのGetKey系とGetButton系のどっちを使えば良いの？を調べてみた](http://qiita.com/RyotaMurohoshi/items/688fe33f44de8339c497)
* [GetKeyDownとかGetButtonUpとかがtrueになるタイミングの遷移について](http://qiita.com/RyotaMurohoshi/items/a5cde3c17831adda12db)

　などの投稿で紹介したボタン・キーの入力を検知するメソッドと、Input.GetAxisメソッドはいくつか違いがあります。また、一部共通の部分もあります。

　Input.GetButton系、そしてInput.GetKey系のメソッドは、押したか押していないかを表す真理値を返します。

　一方でInput.GetAxisメソッドは、実数(float)を返します。

```csharp:Input.GetAxisメソッドのサンプル(再掲)
using UnityEngine;

public class HelloInputGetAxis : MonoBehaviour
{
	void Update ()
	{
		float dx = Input.GetAxis ("Horizontal");
		float dy = Input.GetAxis ("Vertical");
		transform.Translate (dx, dy, 0.0F);
	}
}
```

　例えば上記のコードで上矢印キーを押した場合、dyにはfloat型で正の値が代入されます。押し始めてすぐのフレームでは0.01Fなど小さな値ですが、連続で押し続けることで、徐々に値が増えていき、1.0Fになります。1.0Fになった後にボタンを押し続けても、それ以上値は増えません。

　前述のように、キーボードやJoyStickの入力に対して、Input.GetAxisは-1.0Fから1.0Fを返します。一方でマウスの移動とウィンドウの移動の入力に対して、Input.GetAxisは-1.0Fから1.0よりも絶対値が大きい値を返すようです。
　
　Input.GetButton系のメソッドとInput.GetKey系のメソッドと同様に、Updateメソッド内で実行します。

　Input.GetAxisメソッドは、Horizontal、Verticalなどの各項目が、それぞれどのキーと対応するのか、などの設定をInputManagerで行います。これは、Input.GetButton系のメソッドと同じですね。InputManagerの設定ビューは、Edit -> Project Settings -> Inputを選択することで表示されます。

　Input.GetButton系で使う項目(Fireなど)は、ボタンを押したか押されていないかを検知するために使います。そのため一つのキーのみ(もしくは替わり
のButton(Alt Positive Button)を含めて二つ)を、入力キーとして設定すればいいです。

　一方で、Input.GetAxisで使う項目(Horizontal、Verticalなど)は、正方向の入力を検知するボタンと、負方向の入力を検知するボタンを設定します。例えばHorizontalという項目は、Negative Button(負方向の入力)にleftキー(左矢印キー)が、Positive Buttonにrightキー(矢印右キー)が設定されています。また代替キーとして、Alt Negative Buttonにaキーが、Alt Positive Buttonにdキーが設定されています。

　Horizontalという項目は、Joystickでの入力を扱う項目もあります。

# InputManagerのInput.GetAxisの関連設定項目

　InputManagerの設定項目には、Positive ButtonやNegative Buttonなど以外にもいくつかの設定項目があります。Input.GetAxisメソッドに関連するInputManagerの設定項目を示します。

　[こちら](http://unity3d.com/learn/tutorials/modules/beginner/scripting/get-axis)のUnityのチュートリアル動画GetAxisでは、動画でわかりやすく各設定項目を説明しています。

## Gravity

　キーやJoyStickなどの入力をやめた際にInput.GetAxisの返す値が0になるまでの早さの設定値です。数値が大きいほど、0に戻る時間が短いです。

## Sensivity

　キーやJoyStickなどの入力を始めてから、Input.GetAxisの返す値が-1.0Fもしくは1.0Fに到達するまでの早さの設定値です。数値が大きいほど、-1.0Fもしくは1.0Fに到達するまでの時間が短いです。

## Dead

　JoyStickなどでの入力の際、微小な入力で動かないようにするための設定値です。設定値が大きいほど、動かない入力値が大きくなります。

## Snap

　正の値と負の値が同時に入力された際、入力値を0とするかどうかの設定です。

## Type
 
* Key or Mouse Button
* Mouse Movement
* Joystic Axis

　以上の3個があります。Horizontal、Jump、Fire1、MouseXなどの各項目に対して、適切な入力タイプを設定します。

## Invert

　この項目をOnにする(チェックボタンをチェックする)と、Input.GetAxisの返り値が、Positve Buttonでの入力の場合は負の値に、Negative Buttonでの入力の場合は負の値になり、正負が反転します。

## Axis

* X Axis
* Y Axis
* 3rd Axis(Joystics and ScrollWheel)
* 4th Axis(Joystics)

から

* 20th Axis(Joystics)

があります。

　デフォルトでは、Vertical(下の方のJoystickでの入力を検知するもの)という項目とMouse Yという二つの項目のAxisがY Axisになっています。Mouse ScrollWheelという項目のAxisは3rd Axis(Joystics and ScrollWheel)になっています。それ以外の項目は、X Axisに設定されています。

# 複数の入力があった場合は？

　同じ項目に対して複数のキーから入力があった場合、InputManagerの[こちら](http://docs.unity3d.com/Manual/ConventionalGameInput.html)の解説によると、絶対値が大きい方の値が採用されるとのことです。

# Input.GetAxisRaw

　[Input.GetAxisRaw](http://docs.unity3d.com/ScriptReference/Input.GetAxisRaw.html)メソッドというメソッドもあります。
キーボードでの入力は、-1.0Fか0.0Fか1.0Fを返すようです。入力値を自分自身で管理したいのであれば、このメソッドを使うと良いそうです。

# まとめ

　Input.GetAxisメソッドは、スマートフォン向けのゲーム開発などでは、使う機会はあまりないかもしれません。InputManagerにInput.GetAxisの関連項目がこんなにあるとは知りませんでした。

　キーボードやJoystick、そしてInput.GetAxisメソッドを使うゲームを作る際、それまでInput.GetAxisとInputManagerの設定について知らなかった方の役に立てると嬉しいです。