ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity入門 - キーボードやゲームパッドなどの入力を取得しよう, Input Manager -

初めに



 キーボードやゲームパッドなどのデバイスからゲームを操作できるように、キー入力を取得する方法を解説します。

キーボードの入力を取得する

 まずは、キーボードの入力を取得してみます。Input.GetKeyを用いることで入力を取得することができます。今回は、スペースキーを押してオブジェクトを動かしてみます。

 Sphereを生成し、次のスクリプトをアタッチしましょう

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  //TextはUIのため追加

public class InputScript : MonoBehaviour
{
    //入力中か否か画面に表示するためのText
    //画面にTextを表示しないのであればいらない
    //画面にTextを表示するのであれば, Textに関する部分をアンコメントし, インスペクターからTextをアタッチしてください
    //public GameObject JudgeinputText;
    //Text judgeinput;

    void Start()
    {
      //TextのComponentを取得
      //judgeinput = JudgeinputText.GetComponent<Text>();
    }

    void Update()
    {
        if (Input.GetKey(KeyCode.Space))  //スペースキーが押されているとtrueを返す
        {
          this.transform.position += new Vector3(0.1f, 0.0f, 0.0f);
          //入力中か否か画面に表示するためのTextを操作する
         // judgeinput.text = "スペースキーを入力中";
        }
        //else
        //{
          //入力中か否か画面に表示するためのTextを操作する
          //judgeinput.text = "スペースキーは入力していない";
        //}
    }
}

 実行してみましょう。

 スペースキーが押されていることが取得できました。

Input GetKeyについて

 InputGetKeyには、次の3種類あります。それぞれ取得するタイミングが異なります。

名前 内容
InputGetKey キーを押している間はずっとtrueを返す
InputGetKeyDown キーが押されていない状態から押された瞬間だけtrueを返す
InputGetKeyUp キーが押されている状態からキーを離した瞬間だけtrueを返す

キーコードについて

 InputGetKeyを使うには、キーコードが必要になります。さきほどはスペースキーのキーコードであるSpaceを使いました。
 よく使うキーコードは、矢印キーでしょうか。

名前 内容
左矢印キー LeftArrow
右矢印キー RightArrow
上矢印キー UpArrow
下矢印キー DownArrow

 他のキーコードについては、こちらにまとめてありますので、リンク先をご覧ください。

docs.unity3d.com

Input Managerについて

 キーボードの入力は取得できました。しかし、ゲームパッドジョイスティックにはキーは存在しません。そこで、様々なデバイスに対応するために、Input Managerがあります。

Input Managerの開き方

 Edit→Project Settings→Input Managerの順にクリックすると開くことができます。

 Axis(軸)のなかに、Horizontal(水平方向)やVertical(垂直方向)などの項目が並んでいます。
 Horizontalを見てみると、次のようになっています。

 Negative Button、Alt Negative Buttonはそれぞれ左矢印キー、Aキーが割り当てられています。Altは"他の"のような意味なので、どちらのキーを押しても同じ働きをします。Negativeと書いてあるので、左矢印キーかAキーを押すとHorizontalに負の数を返すことになります。
 逆に、Positive Button、Alt Positive Buttonが割り当てられている右矢印キー、Dキーを押すとHorizontalに正の数を返します。
 -1 から 1までの実数を返すのですが、ジョイスティックなどの場合、小数が返ってくることもあります。キーボードのキーであれば、-1か1の整数が返ってきます。
 また、割り当てるキーは自分で変更可能です。

Input Managerを使ってみる

 Input Managerを使って、オブジェクトを動かしてみます。先ほど、Sphereにアタッチしたスクリプトを次のように変更してみます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;  //TextはUIのため追加

public class InputScript : MonoBehaviour
{
    //入力中か否か画面に表示するためのText
    //画面にTextを表示しないのであればいらない
    //画面にTextを表示するのであれば, Textに関する部分をアンコメントし, インスペクターからTextをアタッチしてください
    //public GameObject JudgeinputText;
    //Text judgeinput;

    void Start()
    {
      //TextのComponentを取得
      //judgeinput = JudgeinputText.GetComponent<Text>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetAxis("Horizontal") > 0)  //HorizontalのPositive Buttonが押されたら
        {
          this.transform.position += new Vector3(0.1f, 0.0f, 0.0f);
          //入力中か否か画面に表示するためのTextを操作する
          //judgeinput.text = "Horizontalがプラス";
        }
        else if(Input.GetAxis("Horizontal") < 0)  //HorizontalのNegative Buttonが押されたら
        {
          this.transform.position += new Vector3(-0.1f, 0.0f, 0.0f);
          //入力中か否か画面に表示するためのTextを操作する
          //judgeinput.text = "Horizontalがマイナス";
        }

        if(Input.GetAxis("Jump") > 0)  //JumpのPositive Buttonが押されたら
        {
          this.transform.position += new Vector3(0.0f, 0.2f, 0.0f);
          //入力中か否か画面に表示するためのTextを操作する
          //judgeinput.text = "Jumpがプラス";
        }

        //if(Input.GetAxis("Horizontal") == 0 && Input.GetAxis("Jump") == 0)
        //{
          //judgeinput.text = "何も押されていない";
        //}
    }
}

 実行してみると、次のようになります。

 今回はキーボードでの操作しかしておりませんが、Input Managerを使えば、入力デバイスに関係なく操作できることが分かりました。

最後に

 入力を取得する方法を学びました。Input Managerと呼ばれる便利な機能があることを覚えておけばなんとかなると思います。