こんにちは、ともくんです!
この記事は全14回で完成を目指すシリーズ
「初めてのUnityで2Dシューティングゲームを作ってみよう!」
の第3回目となります。
[前回の記事]
【Unity】2Dシューティングゲームの作り方②:素材の準備と配置方法
前回は、キャラクターや背景というゲームの見た目となる素材を画面に配置していきました。
今度は、この配置したキャラクターを動かしていきましょう!
配置したものを動かすのに必要となってくるのが「プログラミング」です。
プログラミングって言うとなんか難しそうですよね…。
僕も最初はプログラミングと聞いて、「あ、ちょっと明日にしよっかな?」って思いました(笑)
プログラミングは簡単に言えば、素材に魔法をかけるのと一緒です!
「キーボードが押されたら」⇒「キャラクターを動かす」
ゲーム素材にこの魔法をかけてあげるのがプログラミングです。
自分で操作してキャラクターが動くようになると、とっても愛着湧いてきますよ!
難しい言葉もいくつか出てきますが、ゆっくりと進めていきましょう!
スクリプトの作成
配置したオブジェクトを動かしたり処理を加えていくためには、スクリプトを作成してオブジェクトにアタッチしていく必要があります。
まずスクリプトを作成する際は、プロジェクトウィンドウの「+」ボタンをクリックして、「MonoBehaviourScript」を選択すると、スクリプトファイルが作成できます。


作成すると、スクリプト名を入力する画面になるので、ここでは「PlayerController」という名前に変更しておきます。

なお、スクリプトもアセットフォルダ内に保存されるので、今回はスクリプト用に「Scripts」というフォルダを作成してそこに格納しています。
スクリプトの中身はこの後書きますが、オブジェクトにアタッチしないとスクリプトがあるだけでは処理が行われません。
そのため、保存したスクリプトファイルをヒエラルキーウィンドウのプレイヤーにドラッグ&ドロップして、スクリプトをアタッチしておきます。

プレイヤーを選択して、インスペクターウィンドウにスクリプトが表示されていれば、アタッチがちゃんと出来ています。

フレームレートの固定方法
スクリプトにプレイヤーの処理を書いていく前に、フレームレートを固定する設定を書いておきましょう。
フレームレートとは、1秒間に画像が何回切り替わっているのかを表した数字のことで、Unityではデフォルトのままだと、コンピューターの環境などによってゲームの速さが変わってしまいます。
そこで、このフレームレートを今回は60fpsに固定化しておきたいと思います。
先ほど保存した「PlayerController」のスクリプトを開いて、Start()メソッドに以下のように記載します。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Start()
{
Application.targetFrameRate = 60; // フレームレートを60fpsで固定
}
}なお、Start()メソッドとは、ゲームを実行したら最初に1回だけ行われる処理を書く場所となっています。
また、メニューバーの「Edit」から「ProjectSettings」を選択して、

「Quality」から「VSync Count」の項目を「Don‘t Sync」に変更します。

これでフレームレートを固定化する設定が出来ました。
プレイヤーをキー操作で移動する処理
次に、キャラクターをキーボードで操作できるように、PlayerControllerのスクリプト内に移動処理を書いていきます。
ここでは、キーボードのWキーで上、Aキーで左、Sキーで下、Dキーで右と、それぞれのキーを押している間はキャラクターが移動できる、というスクリプトを書いていきます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
float playerSpeed = 0.05f; // プレイヤー速度の変数
void Start()
{
Application.targetFrameRate = 60; // フレームレートを60fpsで固定
}
void Update()
{
if (Input.GetKey(KeyCode.W)) // Wキーを押している間
{
transform.Translate(0, playerSpeed, 0); // Y座標をプラス側(上)に進む
}
if (Input.GetKey(KeyCode.A)) // Aキーを押している間
{
transform.Translate(-playerSpeed, 0, 0); // X座標をマイナス側(左)に進む
}
if (Input.GetKey(KeyCode.S)) // Sキーを押している間
{
transform.Translate(0, -playerSpeed, 0); // Y座標をマイナス側(下)に進む
}
if (Input.GetKey(KeyCode.D)) // Dキーを押している間
{
transform.Translate(playerSpeed, 0, 0); // X座標をプラス側(右)に進む
}
}
}5行目でプレイヤー速度の変数playerSpeedをfloat型で宣言していて、「0.05」で一旦設定を書いています。
変数とは、数値や文字列を入れた箱のようなもので、スクリプト内で何度も出し入れすることができます。
そして、14~29行目でそれぞれのキー操作をInput.GetKeyというメソッドで検知して、if文で条件指定しながら処理を書いていきます。
Input.GetKeyは、キーボードを押している間を検知することができるメソッドで、後ろに引数としてどのキーボードのボタンかを指定することができます。
また、if文は条件指定をするための制御文で、キー入力している際の処理などを作る際に使います。
移動する処理は、今回重力機能を付けないので、座標を直接移動できるtransform.Translateというメソッドを使用して書いています。
このtransform.Translateは、後ろにVector3型の(x, y, z)を引数としてあげることで、その座標分を移動させるという処理を行います。
なお、このキー操作や移動処理はUpdate()というメソッド内に書いています。
Updateメソッドは、フレームごとに何度も処理を繰り返す場所になっていて、オブジェクトの移動のように何度も行う処理や、if文を使った制御処理などは、このUpdateメソッドの方に書いていきます。
スクリプトが書けたら、実際にゲームを実行してみましょう。

キー操作でプレイヤーが動けば完了です。
プレイヤーの移動制限の処理を追加する
プレイヤーは無事に動きましたが、このままだとカメラ外にプレイヤーが行けてしまい、ゲーム画面から表示されなくなってしまいます。
そこで、カメラ外にはプレイヤーが行けないという処理をスクリプトに追加していきます。
処理としては、プレイヤーの座標が画面の端にきたら、移動処理を行わなくするという条件をif文の中に追加します。
以下は、PlayerControllerのスクリプトのUpdateメソッド内の処理になります。
void Update()
{
if (Input.GetKey(KeyCode.W) && transform.position.y < 4.4f) // Wキーを押している間かつY座標が4.4より小さい
{
transform.Translate(0, playerSpeed, 0); // Y座標をプラス側(上)に進む
}
if (Input.GetKey(KeyCode.A) && transform.position.x > -2.0f) // Aキーを押している間かつX座標が-2.0より大きい
{
transform.Translate(-playerSpeed, 0, 0); // X座標をマイナス側(左)に進む
}
if (Input.GetKey(KeyCode.S) && transform.position.y > -4.4f) // Sキーを押している間かつY座標が-4.4より大きい
{
transform.Translate(0, -playerSpeed, 0); // Y座標をマイナス側(下)に進む
}
if (Input.GetKey(KeyCode.D) && transform.position.x < 2.0f) // Dキーを押している間かつX座標が2.0より小さい
{
transform.Translate(playerSpeed, 0, 0); // X座標をプラス側(右)に進む
}
}transform.positionを使うことで、プレイヤーの座標を取得することが出来ます。
このtransform.positionを使って、それぞれの移動処理のif文に座標の条件を「&&」演算子で追加することで、プレイヤーが画面の端で止まるように設定してみました。

実際にゲームを実行すると、それぞれの端っこにいくと動きが止まり、カメラ外に行くことが出来なくなりました。
これでプレイヤーの移動処理は完成です。
まとめ
無事にキャラクターが動くようになりましたか?
初めてプログラムを書いた人からすると、「なんかすごいことできちゃったー」って思いますよね!
今回の作業で学んだポイントは、以下の4つになります。
キャラクターが自分で動かせるようになると、一気に「ゲームを操作している」感覚になってきます。
次はもっとプログラムという魔法をかけて、シューティングゲームの醍醐味である「弾を発射する」仕組みを作っていきます。
最後までお読みいただきまして、ありがとうございました!













コメント