Developer

【初心者Unity】キーの入力を判定しよう!(GetKey)
2021.01.13
Lv1

【初心者Unity】キーの入力を判定しよう!(GetKey)

はじめに

Unityでゲームを作ろうというみなさんならきっと覚えがあるでしょう。「スペースキーを押して銃を撃ちたいなぁぁぁ」という悩み!この悩みを解決することがこの記事の役目です!
実はこのお悩み、Input.GetKey()というメソッドを使うことで簡単に解決することができます。とはいってもそもそもこんなメソッド見たことも聞いたこともないという方がほとんどだと思います。ご安心ください。そんなあなたのために、この記事では何と2つも!具体的にスクリプトを作成しながら解説していきます。


Input.GetKey()とは

実際にスクリプトを書く前にまずはInput.GetKey()というメソッドが具体的に何をすることができるのかを紹介していきます。それはズバリ!指定のキーが入力されるとtrueを返してくれます!「trueもらったところでどうするの?」という方もいらっしゃるかと思いますが、重要なのは、指定のキーが入力されたか否かをスクリプト上でGetすることができるということです。つまり、このメソッドがプレイヤーのキーボード(他にもマウスやコントローラ等)とスクリプトを結び付けてくれるというわけです。


指定のキーとは

上の説明で「指定のキー」というあいまいな書き方をしました。その理由としてはエンターキーやスペースキーといったキーボード上の入力は全てこのメソッドで判定することができます。また、キーボードのみならず、マウスやコントローラといった他のUI機器からの入力まで受け取ることができます。大変優秀ですね。。。(笑)具体的な使い方としては以下のようになっています。

Input.GetKey(KeyCode.Return); //エンターキー入力
Input.GetKey(KeyCode.Space); //スペースキー入力
Input.GetKey(KeyCode.A); //「a」入力(b,c,d等の他の文字も同様の入力方法)

また、あくまで上記は一例で、実際にはもっとたくさんあります。興味のある方は下記をチェックしてみてください。

他の入力方法について詳しく知りたい方はこちらの記事を参照

【Unity連載】GetKeyで判定できるキー一覧(KeyCode一覧)


実際に使ってみる(その1)

それでは実際にGetKey()を使ってスクリプトを書いてみましょう。1つ目の例では、エンターキーを入力すると、スクリプトをアタッチした(貼り付けた)オブジェクトがパッと消えるというマジックの様な動きを実装します。
ここで、本記事の内容とは逸れて、オブジェクトを削除するメソッドである「Destroy」が登場します。使い方について詳しく知りたい方は以下を参照してください。

「Destroy」について詳しく知りたい方はこちらの記事を参照

【Unity連載】Destroyを具体例付きで解説

それでは以下スクリプトの解説となります。
GetKey()が使われているのは4行目です。ifの中にGetKeyを入れることで、キーが入力された場合のみ、if以降が読み込まれます。因みに、今回はGetKeyの中に「KeyCode.Return」とあるので、エンターキー入力を判定しています。また、if以降にはDestroyが書かれており、このスクリプトがアタッチされたオブジェクトを削除します。

void Update()
    {
        //エンターキーが入力された場合「true」
        if (Input.GetKey(KeyCode.Return)){
            //オブジェクトを削除
            Destroy(gameObject);
        }
    }

 

「Update」メソッドについてもっと詳しく知りたい方はこちらの記事を参照

【Unity連載】UnityとC#におけるメソッド一覧

エンターキー入力前

エンターキー入力後


実際に使ってみる(その2)

2つ目の例では、矢印キーを使ってオブジェクトを移動させるという大変汎用性の高い動きを実装します。また、今回はGetKey()によって実装しますが、InputGetAxis()を使った方がより簡単に実装できますので、ぜひお試しください。

「GetAxis()」について詳しく知りたい方はこちらの記事を参照

【Unity連載】矢印キーを使ってオブジェクトを操作しよう!(GetAxis)

それでは以下スクリプトの解説となります。
GetKey()が使われているの11行目、16行目、21行目、26行目です。それぞれifの中にGetKeyを入れることで、キーが入力された場合のみ、if文の中が読み込まれます。因みに、今回はGetKeyの中にそれぞれ「KeyCode.RightArrow」「KeyCode.LeftArrow」「KeyCode.UpArrow」「KeyCode.DownArrow」とあるので、矢印キーの入力を判定しています。また、if以降にはそれぞれ座標の増減が記述されています。「→」入力の場合はx方向(横軸方向)に座標が+1、「←」入力の場合はx方向(横軸方向)に座標が-1、「↑」入力の場合はz方向(縦軸方向)に座標が+1、「↓」入力の場合はz方向(縦軸方向)に座標が-1されます。これらの計算によってオブジェクトを移動させています。

//座標の変数定義
    Vector3 pos;
    void Start()
    {
        //オブジェクトの現在の座標を入手
        pos = transform.position;
    }
    void Update()
    {
        //「→」入力の場合は変数「pos」のx軸における座標を毎フレーム毎に1だけ増加
        if (Input.GetKey(KeyCode.RightArrow))
        {
            pos.x += 1;
        }
        //「←」入力の場合は変数「pos」のx軸における座標を毎フレーム毎に1だけ減少
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            pos.x -= 1;
        }
        //「↑」入力の場合は変数「pos」のz軸における座標を毎フレーム毎に1だけ増加
        if (Input.GetKey(KeyCode.UpArrow))
        {
            pos.z += 1;
        }
        //「↓」入力の場合は変数「pos」のz軸における座標を毎フレーム毎に1だけ減少
        if (Input.GetKey(KeyCode.DownArrow))
        {
            pos.z -= 1;
        }
        //変数「pos」の値をオブジェクトの座標に反映させる
        transform.position = pos;
    }

おまけ(ちょいむず・飛ばしておっけー)

私たちがキーボードを叩くとき、無意識のうちにしていることがあります。それは何かというと、「一瞬のクリック」と「長押しクリック」です。作成するゲームによってはこの違いに大きな影響を受けるものがあります。例えば、シューティングゲームにおいて、一瞬のクリックでは弾を1回しか撃たないが、長押しをしている間は弾を撃ち続けるといった違いです。更にゲームによっては、キーを押した瞬間の動作、押し続けている間の動作、離した瞬間の動作、といった形でタイミングをこの3種類に細分化する必要のあるものもあります。例えば、ルーレットゲームにおいて、キーを押した瞬間に「ルーレットが回る」、押し続けている間は「背景のアニメーションが流れる」、離した瞬間に「ルーレットが止まる」といった具合です。
上に挙げた「キーを押した瞬間」、「押し続けている間」、「離した瞬間」の3種類のタイミング。これらを指定する方法(メソッド)は以下のようになっています。

GetKey(); //「キーを押した瞬間」を判定(本記事のメソッド)
GetKeyDown(); //「キーを押し続けている間」を判定
GetKeyUp(); //「キーを離した瞬間」を判定

 

連載目次リンク

「初心者のための」Unityゲーム制作 目次

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次