【Unity】2Dシューティングゲームの作り方③:プレイヤーの移動処理

Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、Unityを使った2Dシューティングゲームの作り方3回目として、プレイヤーの移動処理について紹介しています。

前回、ゲームで使う素材をUnityに配置していきました。

今度はUnity内に配置したオブジェクトを動かしたり、処理を加えていくためにスクリプトを作成して、それをオブジェクトにアタッチする作業を行っていきます。

そして、プレイヤーのキャラクターを操作するためには、キー操作の入力を検知して、それに合わせてオブジェクトを動かすという処理をスクリプトに書いていきます。

そこで、スクリプトファイルの作成からプレイヤーのキャラクターをキーボードで操作できるまでをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

スクリプトの作成

配置したオブジェクトを動かしたり処理を加えていくためには、スクリプトを作成してオブジェクトにアタッチしていく必要があります。

まずスクリプトを作成する際は、プロジェクトウィンドウの「+」ボタンをクリックして、「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文に座標の条件を「&&」演算子で追加することで、プレイヤーが画面の端で止まるように設定してみました。

実際にゲームを実行すると、それぞれの端っこにいくと動きが止まり、カメラ外に行くことが出来なくなりました。

これでプレイヤーの移動処理は完成です。

まとめ

このページでは、プレイヤーをキー操作で動かす処理を作っていきました。

キー操作でオブジェクトを動かす場合は、

の処理を書いていくことで、オブジェクトを動かすことができます。

次は、このプレイヤーが弾を撃つという処理を加えていきます。

最後までお読みいただきまして、ありがとうございました!

コメント