前回、キャラクターの表示まで出来たので、キーボード操作でキャラクターを操作するプログラムを作りたいと思います。
Projectタブ内のPlayerフォルダを右クリックし、Create > C# Scriptを選択します。
これは、プログラムを書くためのファイルで、キーボードを押した時の処理や、敵や障害物とぶつかった処理などを書くことが出来ます。
作成されたファイル名は何でも良いのですが、分かりやすいように「PlayerScript」という名称にしておきましょう。
名前を変えたらダブルクリックでファイルを編集します。
ダブルクリックすると、ファイルを編集するためのソフトが立ち上がります。
緑枠で囲った箇所は、先ほど変更した名前と合わせておきましょう。
プログラムの内容を以下のように書き換えてみましょう。
詳しい内容については、後ほど解説します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerScript : MonoBehaviour { Rigidbody2D rb; // Use this for initialization void Start () { rb = GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update () { //Aキーを押した時 if (Input.GetKeyDown(KeyCode.A)) { rb.AddForce(Vector2.left * 20); } //Sキーを押した時 if (Input.GetKeyDown(KeyCode.S)) { rb.position = new Vector2(0.0f, 0.0f); //位置を中央に戻す rb.velocity = Vector2.zero; //加速度を0にする } //Dキーを押した時 if (Input.GetKeyDown(KeyCode.D)) { rb.position += new Vector2(2.0f, 0.0f); } //Wキーを押さえている間 if (Input.GetKey(KeyCode.W)) { rb.position += new Vector2(0.0f, 2.0f) * Time.deltaTime; } } }
ファイルの編集が出来たら、「PlayerScript」を「player_fly_f02」にドラッグ&ドロップしましょう。
すると、画面右側のInspectorを確認すると、Player Scriptというのが追加されていることが確認できます。
先ほど作成したプログラムを、ひよこにセットするための準備となります。
次に、「player_fly_f02」を選択した状態で、画面右のInspectorタブ内にある「Add Conponent」を選択し、Psysics 2D > Rigidbody 2Dを選択します。
これは、先ほど書いたプログラムを有効にするための準備です。
すると、画面右側にRigidbody 2Dというのが追加されます。
緑枠内にあるGravity Scaleの値は0にしておきましょう。
これは、重力の設定値を意味しており、値が設定されていると、ひよこがどんどん下に移動してしまいます。
では、これで再生ボタンを押してゲームを確認してみましょう。
以下のコマンドでひよこを操作することが出来るようになっています。
Aキー | 押した時、左に移動するスピードが増します |
Sキー | 押した時、画面中央に移動し、移動スピードがリセット |
Dキー | 押した時、右に移動 |
Wキー | 押さえている間、ひよこが上に移動 |
今回、学習目的で様々なプログラムの書き方を盛り込みました。
プログラムの内容について、解説していきます。
Rigidbody2D rb; // Use this for initialization void Start () { rb = GetComponent<Rigidbody2D>(); }
Rigidbody2Dは、キャラクターを移動させたり、敵や障害物と衝突のチェックをしたり、重力を加えたりするための機能です。
上記の記述はその準備のための決まった書き方と覚えてしまって良いです。
ちなみに、Start()というのは、最初に一回だけ処理するという意味になります。
// Update is called once per frame void Update () { (中略) }
Update()は、定期的に処理するという意味です。
キーボードを押した時にキャラクターを移動させたり、障害物に当たった処理など、毎回チェックする必要のあるものはこの{から}までの間に書きます。
//Aキーを押した時 if (Input.GetKeyDown(KeyCode.A)) { rb.AddForce(Vector2.left * 20); }
Input.GetKeyDownはかっこ内(今回の場合、KeyCode.A)のキーを押した時に{から}までの間の処理を実行するという意味になります。
KeyCode.AはキーボードのAキーを指します。
AddForceという命令は、力を加えるという意味で、左(Vector.left)に進む力を*20(×20倍)加えることになります。
ここで加える力を20から40に変えると進むスピードが増します。
Aキーを更に押すと、更に進む力が加わり、どんどんスピードが速くなっていきます。
ちなみに、Vector.rightになると右側に進むようになります。
//Sキーを押した時 if (Input.GetKeyDown(KeyCode.S)) { rb.position = new Vector2(0.0f, 0.0f); //位置を中央に戻す rb.velocity = Vector2.zero; //加速度を0にする }
positionというのは、ひよこの現在位置を表し、X座標に0.0f(.0fは小数点以下を表す)、Y座標に0.0fに移動させるという意味です。
velocityというのは、加速度を表し、Vector2.zeroをセットすると加速度を0にするという意味になります。
//Dキーを押した時 if (Input.GetKeyDown(KeyCode.D)) { rb.position += new Vector2(2.0f, 0.0f); }
+=という書き方は加算するという意味になり、加算する値はVector2(2.0f, 0.0f)です。
最初の2.0fはX座標を表し、右側に2.0進めるという意味になります。
次の0.0fはY座用を表し、0.0なので加算も減算もしないので、Y座標は移動しません。
2.0fを-2.0fに書き換えると、左側に進むようになります。
この書き方だと、瞬間移動するような見え方になるので、あまり使う機会はないかと思います。
//Wキーを押さえている間 if (Input.GetKey(KeyCode.W)) { rb.position += new Vector2(0.0f, 2.0f) * Time.deltaTime; }
先ほどのDキーを押した時の書き方に似ていますが、こちらはInput.GetKeyDownに代わって、Input.GetKeyになっています。
これは、押さえている間という意味になるので、キャラクターを移動させる際にはこちらの書き方が良いでしょう。
また、「* Time.deltaTime」という記述が増えています。
これは、前のフレームから次のフレームに変わるまでにかかった処理時間を指します。
パラパラ漫画をイメージしてもらうと分かりやすいのですが、フレームというのはパラパラ漫画の1枚の絵のことです。
1枚の絵から次の絵に変わるまでの時間がTime.deltaTimeでこれが1秒間に60回絵が変わる場合、「* 1/60」となり、1秒間に30回絵が変わる場合、「* 1/30」となります。
1秒間に60回呼ばれる場合と1秒間に30回呼ばれる場合、同じようにX座標に2を加算すると、移動スピードが変わってしまいます。
1秒間に60回呼ばれる場合:2 * 60 = 120進む
1秒間に30回呼ばれる場合:2 * 30 = 60進む
これを1秒間に絵が変わる回数が変わっても同じだけ進むようにするためにTime.deltaTimeを使います。
1秒間に60回呼ばれる場合:2 * 60 * 1/60 = 2進む
1秒間に30回呼ばれる場合:2 * 30 * 1/30 = 2進む
※赤太字部分が、Time.deltaTimeです。
最後に、以下のようにPlayerScriptを直して、AキーとDキーを押さえている間、左右に移動するように修正しましょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerScript : MonoBehaviour { Rigidbody2D rb; // Use this for initialization void Start () { rb = GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update () { //Aキーを押さえている間 if (Input.GetKey(KeyCode.A)) { rb.position += new Vector2(-2.0f, 0.0f) * Time.deltaTime; } //Sキーを押した時 if (Input.GetKeyDown(KeyCode.S)) { rb.position = new Vector2(0.0f, 0.0f); //位置を中央に戻す rb.velocity = Vector2.zero; //加速度を0にする } //Dキーを押さえている間 if (Input.GetKey(KeyCode.D)) { rb.position += new Vector2(2.0f, 0.0f) * Time.deltaTime; } } }