UnityのInputのクラス
UnityのInputとは入力情報へアクセスできるようになるクラスだ。例えばキーを入力するとキャラが動いたり弾を撃つといった操作が可能だ。
この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
if文の条件分岐
また、Unityの基礎知識や操作などがわからない場合は先に以下の記事を確認してほしい。
Unityの基礎まとめ
この記事ではInputの各関数の使用方法について紹介していく。
UnityのInputの使用方法目次
Input.GetKey関数Input.GetAxis関数
Input.GetButton関数
Input.GetMouseButton関数
目次にもどる
Input.GetKey関数の使い方
まず、Input系の関数の一つであるInput.GetKey関数について紹介していく。動かすゲームオブジェクトとしてcubeを一つ作成しよう。また、cubeがどう動いているか、わかりやすいようにplaneも一つ作成しよう。
ゲームオブジェクトの位置調整を行い、planeのすぐ上にcubeがあるような状態にして、ゲームビューで見やすいようにMain Cameraの位置を調整しよう。
新しいスクリプトに以下のように記述して、cubeのゲームオブジェクトにアタッチしよう。再生時にWASDキーを押すことで前後左右に動くcubeとなる。
Updateメソッド(クラスが有効である場合に毎フレームごとにUnity側から呼ばれる)の中に記述を行った。
最初は以下の文となっている。 if (Input.GetKey(KeyCode.W))
{
this.transform.Translate(0.0f, 0.0f, 0.1f);
}
if (Input.GetKey(KeyCode.W))で「Wキーが押されたなら」という条件となり、条件を満たすならthis.transform.Translate(0.0f, 0.0f, 0.1f);の処理が行われる。
this.transformとはスクリプトをアタッチしたゲームオブジェクトcubeの位置・回転・大きさを指す。
Translateは相対的な位置を指定して移動させることができる。現在位置と比較して前に1.5進むといった記述を行え、比較的わかりやすいのが特徴。前というのはZ軸方向に進むことを指す。Translate(0.0f, 0.0f, 0.1f)と記述されており、Zの部分だけ0.1f進むようになっている。
this.transform.Translate(0.0f, 0.0f, 0.1f);で、「このゲームオブジェクトの位置をZ軸方向に0.1f進ませる」という意味となる。
Updateメソッドにより1フレームに1回処理されるので、Wキーを押している間はZ方向へ前進するようになる。
A、S、Dのキーについても同様の記述を行った。
Translateの記述は後ろ移動(S)はZの部分に-0.1fと記述すればいい。右移動(D)はX部分に0.1fと記述、左移動(A)は-0.1fと記述すればOKだ。
ちなみにキーを押した瞬間を検知したい場合はif (Input.GetKeyDown(KeyCode.W))のようにInput.GetKeyDownを使おう。
キーから指が離れた瞬間を検知したい場合はif (Input.GetKeyUp(KeyCode.W))のようにInput.GetKeyUpを使おう。
目次にもどる
Input.GetAxis関数の使い方
続いて、Input系の関数の一つであるInput.GetAxis関数について紹介していく。先ほどと同様に動かすゲームオブジェクトとしてcube、その動きがわかりやすいようにplaneを準備してほしい。新しいスクリプトに以下のように記述して、cubeのゲームオブジェクトにアタッチしよう。再生時にWASDキー(矢印キーでもOK)を操作することで前後左右に動くcubeとなる。
クラス内にVector3 pos;と記述して、構造体()を作った(Vector3の場合、三次元ベクトルを表現するためのもので、xの値、yの値、zの値をまとめて持つ)。
float speed = 0.05f;と記述して移動速度を代入しつつシリアル化した。
Startメソッドでpos = transform.position;と記述し、ゲームオブジェクトの最初の位置を取得(transform.positionにはゲームオブジェクトXYZ座標が入っている)
残りはUpdateメソッドの中に記述を行った。
最初は以下の文となっている。
float movez = Input.GetAxis("Vertical");
Input.GetAxis("Vertical")とある。Verticalには縦という意味がある。WSキーあるいは↑↓キーが押された時に値として受け取るという意味となる。。Wや↑の場合はボタンを押し続けることで値が少しずつ上がり1に近づいていく。同様にSや↓の場合はボタンを押し続けることで値が-1に近づいていく。その値をmovezに代入している。
下の行にはpos.z += (movez * speed);と記述し、movezとspeedをかけた数がVector3の構造体のzに代入される。
そして、transform.position = pos;により、posの値がtransform.positionに代入される。つまりゲームオブジェクトcubeの位置座標に反映される。
float movez = Input.GetAxis("Horizontal");でADキーあるいは←→キーが押された時の値も受け取り、上記と同様に計算している。
最初に紹介したInput.GetKeyと比較して大きく異なるのは「ボタンを押し続けることで値が少しずつ上がり1に近づいていく」点。
float speed = 0.05f;のところを[SerializeField] float speed = 0.05f;の記述に変えてみよう。インスペクター欄でspeedの調整が可能となり、スクリプトを開かずにすむのでとても便利だ。
これをシリアル化(シリアライズ)と言う。詳しくは以下の記事で紹介している。
シリアル化について
今回はInput.GetAxis("Vertical")とInput.GetAxis("Horizontal");を使用した。
他にもInput.GetAxis("Mouse X")やInput.GetAxis("Mouse Y")でマウスカーソルの移動量も受け取ることができる。
Mouse Xは横方向、Mouse Yは縦方向のマウスカーソル移動量を受け取れる。キャラの視点移動時などに重宝する。
Input.GetAxisは"Vertical"や"Mouse X"などの文字列の記述でキー入力を受け取ることが可能となっているが、どの文字列がどのキー入力に対応しているかの設定はInputManagerを見ればわかる。
「Edit」→「Project Settings」のように選択する。
InputManagerの項目を選択し、三角のボタンを押せば文字列の一覧が出てくる。
例えばVerticalの△を開き以下の部分を見てほしい。
どの文字列でどのキー入力を受け取るかが表示されている(upは上矢印ボタン、downは下矢印ボタンを示す)。
ここに表示されているキーを変えればスクリプトを変えずとも操作キーの変更が行えるのが大きな利点だ。
目次にもどる
Input.GetButton関数の使い方
続いてInput.GetButton関数について紹介していく。先ほどと同様に動かすゲームオブジェクトとしてcube、その動きがわかりやすいようにplaneを準備してほしい。新しいスクリプトに以下のように記述して、cubeのゲームオブジェクトにアタッチしよう。再生時にスペースボタンを押している間Cubeが上昇するようになる。
Updateメソッドの中に記述を行った。
最初のif (Input.GetButton("Jump"))は「Spaceボタンが押され続けていたら・・・」という処理になる。
Input.GetButtonもInput.GetAxisと同じく、InputManagerに割り当てられている設定の文字列を記述することで使える。
例えば今回使用した文字列の"Jump"についてもInputManagerで最初から用意されている。
Input.GetButtonでJumpの文字列を指定することでSpaceボタンの入力を受け取ることが可能となっている。 If文にしてあり中身の処理はthis.transform.Translate(0.0f, 0.01f, 0.0f);となっている。よって再生するとスペースボタンを押している間Cubeが上に上昇していく。
ちなみにInput.GetButtonDownとすればボタンを押した瞬間、Input.GetButtonUpとすればキーがボタンから離れた時を検知することができる。
目次にもどる
Input.GetMouseButton関数の使い方
マウスのボタン入力を受け取ることができるInput.GetMouseButton関数について紹介していく。先ほどと同様に動かすゲームオブジェクトとしてcube、その動きがわかりやすいようにplaneを準備してほしい。新しいスクリプトに以下のように記述して、cubeのゲームオブジェクトにアタッチしよう。再生時に左クリックしたままで前に移動、右クリックしたままだと後ろに移動、中央ボタン(マウスのコロコロ)を押した状態だと上昇するようになる。
Updateメソッドの中に記述を行った。
最初のif(Input.GetMouseButton(0))は「左クリックが行われ続けていたら・・」という処理になる。
GetMouseButton(0)は左クリックが押され続けていること、GetMouseButton(1)は右クリックが押され続けていること、GetMouseButton(2)はマウスの中央ボタンが押され続けていると入力を受け取る。ボタン押しっぱなしでマシンガンなどを連射したい場合はこれを使おう。
Input.GetMouseButtonDown(0)だと左クリックが押された瞬間に入力を受け取る。ボタンを押した瞬間に弾を撃ちたい場合などはこれを使用するといい。
Input.GetMouseButtonUp(0)だと左クリックが離された後に入力を受け取る。
このように左クリック、右クリック、マウス中央ボタンそれぞれで条件分岐した。
中身の処理は左クリックであれば、this.transform.Translate(0.0f, 0.0f, 0.1f);でZの部分だけ0.1f進むようにして前に進むようにした。同様に右クリックでは後移動、マウス中央ボタンでは上移動の処理を行った(相対的な位置を指定して移動させるTranslateについてはInput.GetKeyの説明で紹介している)。