【Unity】2Dシューティングゲームの作り方⑪:お助けアイテムの作成

Unity

こんにちは、ともくんです!

この記事は全14回で完成を目指すシリーズ
「初めてのUnityで2Dシューティングゲームを作ってみよう!」
の第11回目となります。

[前回の記事]
【Unity】2Dシューティングゲームの作り方⑩:リトライポイントの作成

前回、リトライポイント(チェックポイント)を作ってゲームを途中から再開する仕組みができました。
現状でも良い感じではありますが、ずっとプレイヤーのスピードが変わらず、同じ弾が発射されるというのも段々飽きてきそうですよね?

そこで今回は、シューティングゲームの醍醐味の一つでもある「パワーアップアイテム」を作って、ステージ内に配置していきます。

アイテムを拾ったかどうかを判定するスイッチを変数で作ってあげることで、プレイヤーを強化する仕組みが作れます。

ここでは、「スピードアップ」と「弾数増加」のアイテムを作りますが、アイデア次第で独自のアイテムも作れちゃいますよ!

アイテム用の変数を作成する

まずは、アイテムを所持しているかどうかを判定する変数を作成します。

今回は、

の2つのアイテムを作りたいと思うので、それぞれに変数を作ります。

そしてこの変数は、GameManager上で管理させて、一度リトライしてもアイテムを所持している状態にしたいと思います。

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager instance; // 静的なGameManagerのインスタンスを作成
    public int lifeCount;   // ライフの数を計算する変数
    public int scorePoint;  // スコアの数を計算する変数
    public int startPos;    // スタート位置を決める変数
    public int speedUpItem; // 速度アップのアイテム所持の変数
    public int bulletUpItem;    // 弾数アップのアイテム所持の変数

	// 以下省略 //

}

9行目で速度をあげるアイテムの変数speedUpItem、10行目で弾数を増やす変数bulletUpItemを宣言して、どちらもint型の変数で、アイテムをプレイヤーが取ったら「1」に更新するという形でこの後作っていきます。

なお、GameManagerについては、以下の記事で紹介していますので、参考にしてみてください。

プレイヤーの速度をあげるアイテムの処理

2つのうち、まずはプレイヤーの速度をあげるアイテムの処理を作り、ゲーム内にアイテムを配置していきます。

プレイヤーの速度をあげる処理

プレイヤーの速度をあげる処理は、プレイヤーに紐づけているPlayerControllerに記述していきます。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    float playerSpeed = 0.05f;  // プレイヤー速度の変数
    bool isSpeedUp = false;   // スピードアップ中かどうかを判定する変数

    void Update()
    {
        if (GameManager.instance.speedUpItem == 1 && isSpeedUp == false)    // 速度アップアイテムを持っている場合
        {
            playerSpeed *= 1.5f;    // プレイヤーの速度を1.5倍にする
            isSpeedUp = true;   // スピードアップ中の変数をtrueに変更する
        }

	// 以下省略 //

    }
}

10行目のif文の中でGamaManagerで管理している変数のspeedUpItem「1」の場合に、速度を1.5倍にする処理を行っています。

そのままだと、アイテムを持っているとフレームごとに速度をあげる処理が重複して行われてしまうので、スピードアップをすでに行ったかどうかの判定を行う必要があります。

そこで、bool型isSpeedUp変数を使って、一度スピードアップの処理が行われたら、6行目でtrueに更新して重複しないようにしています。

これで、速度をあげる処理をスクリプト内に書くことができました。

速度をあげるアイテムの当たり判定の処理

次に、スピードアップアイテムをゲーム内に配置して、プレイヤーとの当たり判定の処理を作っていきます。

今回は、Unity Asset Storeにある画像を使い、「speedUpItem」というオブジェクトをstageの中の子オブジェクトとして配置します。

このspeedUpItemに当たり判定を付けるために、Polygon Collider 2Dを付けて、「Is Trigger」にチェックを入れておきます。

当たり判定の処理を作るのに、「SpeedUpItem」というスクリプトを作成して、speedUpItemにアタッチしておきます。

using UnityEngine;

public class SpeedUpItem : MonoBehaviour
{
    public GameObject player;   // プレイヤーを取得するための変数

    void OnTriggerEnter2D(Collider2D collision) // 当たり判定処理
    {
        if (collision.gameObject == player) // プレイヤーと当たった場合
        {
            GameManager.instance.speedUpItem = 1;   // スピードアップの変数を1に更新
            this.gameObject.SetActive(false);   // アイテムを消去する
        }
    }

    void Start()
    {
        if (GameManager.instance.speedUpItem == 1)    // アイテムをすでに取っている場合
        {
            this.gameObject.SetActive(false);   // アイテムを消去する
        }
    }
}

5行目でプレイヤーのオブジェクトを取得する変数を宣言して、7行目でOnTriggerEneter2Dを使って、アイテムとプレイヤーの当たり判定の処理を記述しています。

11行目でプレイヤーと当たった場合に、GameManagerで管理している変数のspeedUpItemの値を「1」に更新しています。

アイテムを手に入れたら、そのあとはアイテムが表示されないように、12行目でSetActiveを使って非アクティブにしています。

また、すでにアイテムを所有してリトライした際にはアイテムが表示されないように、Startメソッド内でもアイテム消去の処理を書いています。

スクリプトが書けたら、speedUpItemを選択し、インスペクターウィンドウのSpeedUpItemのplayer変数に、「player」オブジェクトをドラッグ&ドロップして代入してあげます。

これでプレイヤーの速度をあげるアイテムの処理が完成したので、実際にゲームを実行して確認してみます。

アイテムにプレイヤーが触れると、プレイヤーの速度がちゃんとあがっているので大丈夫そうです。

プレイヤーの弾を増やすアイテムの処理

次に、プレイヤーの弾を増やすアイテムの処理を作っていきます。

プレイヤーの弾を増やす処理

プレイヤーの弾を増やしたいので、弾を発射するポイントを追加していきます。

弾の発射する位置を決めている「playerBulletPoint」のオブジェクトをコピーして、アイテムを取った際に発射される場所に配置していきます。

元の発射位置を決めているものを「playerBulletPoint1」として、それぞれ新しいものを「playerBulletPoint2」「playerBulletPoint3」としてオフで配置しておきます。

アイテムを取った際に、それぞれの発射位置の空オブジェクトのアクティブ状態を変えるので、その処理をPlayerControllerのスクリプトに書いていきます。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    float playerSpeed = 0.05f;  // プレイヤー速度の変数
    bool isSpeedUp = false;   // スピードアップ中かどうかを判定する変数

    public GameObject[] bulletPoint;  // 弾を発射する位置を決めるオブジェクトの配列
    bool isBulletUp = false;    // 弾を増やしているかどうかを判定する変数

    void Update()
    {

	// 省略 //

        if (GameManager.instance.bulletUpItem == 1 && isBulletUp == false)  // 弾数増加アイテムを持っている場合
        {
            bulletPoint[0].SetActive(false);    // 0番目のオブジェクトをオフにする
            bulletPoint[1].SetActive(true);     // 1番目のオブジェクトをオンにする
            bulletPoint[2].SetActive(true);     // 2番目のオブジェクトをオンにする
            isBulletUp = true;  // 弾増加判定の変数をtrueに変更する
        }

	// 以下省略 //
    }
}

8行目で弾を発射する位置を決めるオブジェクト用の配列bulletPointを作成します。

16行目以降でGamaManagerで管理している変数のbulletUpItem「1」の場合に、それぞれのオブジェクトをSetActive関数を使って、アクティブ状態を変更する処理を書いています。

速度をあげるアイテムと同様に、効果が重複しないように、bool型isBulletUp変数を使って、プレイヤーの弾がすでに増えているかどうかを判定しています。

弾を増やす処理が書けたら、「player」のオブジェクトを選択して、インスペクターウィンドウにあるPlayerControllerのbulletPointから+ボタンを押して配列を追加して、ドラッグ&ドロップでplayerBulletPointを順番に設定していきます。

これで、アイテムを取った際に、プレイヤーの弾が増えるという処理を作ることができました。

弾を増やすアイテムの当たり判定の処理

次は、弾を増やすアイテムを配置して、プレイヤーとの当たり判定の処理を作っていきます。

速度をあげるアイテムと同じく、ゲーム内に「bulletUpItem」stageの中に子オブジェクトとして配置します。

当たり判定の処理を書いていくので、bulletUpItemにもPolygon Collider 2Dを付けて、「Is Trigger」にチェックを入れておきます。

アイテムに当たり判定の処理を作っていくので、新しく「BulletUpItem」というスクリプトを作成して、このbulletUpItemのオブジェクトにアタッチしておきます。

using UnityEngine;

public class BulletUpItem : MonoBehaviour
{
    public GameObject player;   // プレイヤーを取得するための変数

    void OnTriggerEnter2D(Collider2D collision) // 当たり判定処理
    {
        if (collision.gameObject == player) // プレイヤーと当たった場合
        {
            GameManager.instance.bulletUpItem = 1;   // スピードアップの変数を1に更新
            this.gameObject.SetActive(false);   // アイテムを消去する
        }
    }

    void Start()
    {
        if (GameManager.instance.bulletUpItem == 1)    // アイテムをすでに取っている場合
        {
            this.gameObject.SetActive(false);   // アイテムを消去する
        }
    }
}

先ほどのSpeedUpItemのスクリプトと同じく、プレイヤーと当たった際にGameManagerの変数bulletUpItemを「1」に更新するように書いていきます。

スクリプトが書けたら、bulletUpItemのオブジェクトを選択して、インスペクターウィンドウからBulletUpItemのplayer変数に「player」のオブジェクトをドラッグ&ドロップで代入します。

これで実際にゲームを実行してアイテムを取ってみます。

プレイヤーの弾が一つだったのが、アイテムを取ると二つになりました。

まとめ

アイテムでプレイヤーをパワーアップさせる仕組みを作ることができましたか?

弾が増えたり、スピードが上がったりするだけで、ゲームもより楽しくなってきますね!

今回のポイントをおさらいしておきます。

アイテムの仕組みは、他にも「特殊な攻撃」を作ってみたり、一定時間の間は「無敵状態」といったものなど、いくらでもアイデアが出てくるのではないでしょうか?

さて、もう一度ゲームをテストプレイした時に、まだ他のシューティングゲームと比べて物足りないなと思うことがありませんか?
そう、弾を発射したときに発射音が鳴っていなかったり、相手に弾が当たっても爆発などの表示がされていないんですよね!

ということで、次の作業は、ゲームに「音とエフェクト」を付けてあげて、ゲームの迫力を引き上げていきましょう!

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

この記事を書いた人

ゲーム作りを学び始めた一児のパパ、ともくんです!

このブログは、子供の「ゲームを作ってみたい!」という一言がきっかけで始まりました。プログラミング経験ゼロから、本を片手に独学でゲーム開発に挑戦している記録です。

初めてゲーム作りに触れる方と同じ目線で、「一緒に学んでいける場所」にできたら嬉しいです!

未熟な部分も多いので、「このコードはもっとこう書けるよ!」といったアドバイスがあれば、ぜひ優しく教えていただけると助かります。

Unity

コメント