Unityを触っていく中で、初期にやりたいことの一つに「方向キーでのオブジェクトの操作」があげられると思います。
僕も自分でゲームを作っている時は、オブジェクトがキー入力で操作できるようになると、ただそれだけなのに楽しくなってきてしまいますし、誰かにやらせたくなってしまいます。(笑)
それに、例えばキャラクターの移動さえできれば、アイディア次第で脱出ゲームや鬼ごっこなどのシンプルなゲームならすぐ作れてしまいそうです。
そんな夢の広がる機能ならば、早く覚えてしまいたいものですね!
今回はまずは初心者向けに「キーボードの方向キーで、オブジェクトを移動する方法」について実例を通して見ていきましょう!
それではよろしくお願いいたします。
Inputクラスとは?
ではまずは実例に入る前に、今回の主役「Inputクラス」について軽く見ていきましょう。
リファレンスで説明を読むと「入力システムのインターフェイス」と記載されています。
参照元:https://docs.unity3d.com/ja/530/ScriptReference/Input.html
リファレンスの難しことはひとまず置いておいて…
初心者はまず、Inputクラスを利用すればユーザーの入力情報へアクセス出来ると覚えましょう。
入力情報さえ取れればあとは「押された場合何をするか」プログラムを組むだけですね!
というわけで、さっそくInputの実例について見ていきましょう。
まずはキー入力でオブジェクトを動かそう!
ではInputクラスを使用し「キーボードの方向キーでオブジェウトを動かす」プログラムまで学んでいきましょう。
以下が今回の説明で作成するものです。
こちらは、キーボードの矢印でオブジェクトを動かしている例ですが…
恐ろしく地味な絵ですね…(笑)
しかし自分の操作の通りにオブジェクトが動くのはそれだけで楽しいものです。
ぜひInputをマスターしましょう!
まずはオブジェクトを作ろう!
まずは「Hierarchy上で右クリック」→「3D Object」→「Cube」を押して四角いオブジェクトを作りましょう。
以下の画面のように四角いオブジェクトが作られたはずです。
スクリプトを紐付ける!
「Projectウィンドウ上で右クリック」→ 「Create」 → 「C# Script」として今回使うスクリプトを用意しましょう。
作れたら名前を決める必要があります。
今回は「MyObject」とでもしておきましょうか。
※最初にスクリプトを作成した時につけたファイル名前が、スクリプト内のクラス名となります。もし名前を間違えたらプログラム内のクラス名も修正してください。
次に、先ほど作成した四角いオブジェクトへスクリプトを紐付けます。
以下の画面のように、作ったスクリプトをクリックしCubeオブジェクトへ投げ入れましょう。
※この際、以下のようなエラーが出る場合があります。(初心者がよく困らされるエラーです。覚えておきましょう。)
和訳すると以下となります。
スクリプトクラスが見つからないため、スクリプトコンポーネント ‘MyObject’を追加できません。コンパイルエラーがなく、ファイル名とクラス名が一致していることを確認してください。
その場合は説明の通り、スクリプト内のクラス名が間違っている可能性がありますので、プログラム内のクラス名を確認してみてください。
特に問題ながなければ、Cubeオブジェクトを選択した時に、以下のようにスクリプトが紐付いているはずです。
プログラムを書こう!
では今回は以下のようにプログラムを組んでみましょう!
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MyObject : MonoBehaviour { void Update () { // 左に移動 if (Input.GetKey (KeyCode.LeftArrow)) { this.transform.Translate (-0.1f,0.0f,0.0f); } // 右に移動 if (Input.GetKey (KeyCode.RightArrow)) { this.transform.Translate (0.1f,0.0f,0.0f); } // 前に移動 if (Input.GetKey (KeyCode.UpArrow)) { this.transform.Translate (0.0f,0.0f,0.1f); } // 後ろに移動 if (Input.GetKey (KeyCode.DownArrow)) { this.transform.Translate (0.0f,0.0f,-0.1f); } } }
プログラムの解説は後ほど行いますので、まずは実行してみましょう!
実行してみる
どうでしょう?
方向キーで動いていますでしょうか?
これでキー入力でオブジェクトを動かすという目標は達成ですね!
まずはキー入力でオブジェクトを動かそう!〜解説編〜
では先ほどのプログラムの解説に入っていきましょう。
Update関数
まず今回のプログラムは「Update関数」の中で実行されています。
簡単に言ってしまえばこの中に記載されたプログラムは、定期的に実行され続けてくれます。
わかる人ならば問題ありませんが、わからない人はこちらの記事で説明していますので、読んでみてください!
Input.GetKey関数
ではまず先ほどのプログラムの左に移動している部分を詳しく見てみましょう。
// 左に移動 if (Input.GetKey (KeyCode.LeftArrow)) { this.transform.Translate (-0.1f,0.0f,0.0f); }
ここでは「Input.GetKey関数」と「Translate関数」が使用されていることがわかると思います。
Input.GetKey関数
Input.GetKey (KeyCode.LeftArrow)
ここが今回のキー入力を取得している部分ですね。
リファレンスを見てみましょう。
public static bool GetKey(KeyCode key);
KeyCode 列挙体パラメーターによる key によって識別されるキーを押している間、true を返します。
参照元:https://docs.unity3d.com/ja/530/ScriptReference/Input.GetKey.html
リファレンスの通り「引数に与えている識別キー」に該当するキーが押されている間、trueを返してくれる関数です。
それを踏まえた上で、もう一度ソースを見てみましょう。
// 左に移動 if (Input.GetKey (KeyCode.LeftArrow)) { this.transform.Translate (-0.1f,0.0f,0.0f); }
つまりこのプログラムでは「KeyCode.LeftArrow(左矢印)」が押されている間「Input.GetKey関数」からtrueが返り「if文の中身が実行」されている。
ということですね!
「KeyCode列挙体」について
今回は「KeyCode.LeftArrow」のように使用したKeyCode列挙体。
方向キー以外にはどんなものがあるのでしょう?
一部抜粋してみました。
KeyCode.A | aキー(bcdeなど他のキーも同じように取れます) |
KeyCode.Space | スペースキー |
KeyCode.Keypad0 | テンキー0 |
KeyCode.F1 | F1 |
KeyCode.Return | エンターキー(リターンキー) |
参照元:https://docs.unity3d.com/ja/530/ScriptReference/KeyCode.html
他にもいろいろなキーコードがあるので、ぜひ一度目を通してみてください。
Translate関数
this.transform.Translate (-0.1f,0.0f,0.0f);
if文の中身のTranslate関数ですが、これはオブジェクトを移動させる関数です。
今回だとx座標に「-0.1f」を加算しているという意味となります。
ボタンを押している間は、これが実行されていたため、オブジェクトが左に移動しているというわけですね!
Translate関数については以下の記事にまとめてありますので、閲覧してみてください。
Inputクラスに詳しくなろう!
ここから先は、よりInputクラスを使いこなすための内容を記載していきます。
マウス操作・ゲームパッド操作、なども随時追記予定ですので、もうしばらくお待ちください。
「押された時」「離した時」はどう取るの?
GetKey関数は「押されている時、trueを返す関数」でした。
しかし開発を進める上で「押された時」「離した時」も欲しくなってきますよね。
実はちゃんと用意されています。
GetKey関数 | name によって識別されるキーを押している間、true を返します。オート射撃のようなものと考えてください |
GetKeyDown関数 | name によって識別されるキーを押したフレームの間だけ true を返します |
GetKeyUp関数 | name によって識別されるキーを離したフレームの間だけ true を返します |
ぜひ「GetKeyDown関数」や「GetKeyUp関数」もうまく活用してみてください!
まとめ
今回はInput関数について見てきました。
しかし今回記載した内容はまだまだ、入力関連の内容の一部にしか過ぎません。
なぜならUnityで扱う入力インターフェースは、ゲームパッド、マウス、スマホのタッチパネルなど多岐にわたるからです。
キーボード入力をマスターしたら、次は作る作品に導入するかもしれない、入力処理について調べてみましょう!