シューティングゲームの作成②

C#

はじめに

一般的なシューティングゲームの基本的な動作となる、敗北条件やプレイヤーの上下左右の移動を組み込んでみました。

プレイヤーと敵の接触を検知するために、Unityの物理演算機能「OnTriggerEnter2D」を使用しています。

ゲーム仕様

新しく追加した仕様には「(新)」を付けています。
変更した仕様に「(変)」を付けています。

  • (新)プレイヤーHP設定:初期HPは5
  • (新)プレイヤーHP表示:画面右上に「HP:X」を常時表示する
  • (新)敗北条件:HPが0になった時点で「GAME OVER」UIを表示し、ゲームを停止する
  • (変)操作方法:WASDキー または 十字キー(上下左右の移動)
  • (新)攻撃方法:自動発射
  • (新)敵キャラ実装数:20体(e001~e020)
  • (新)敵キャラHP
    • (新)e001~e010:1
    • (新)e011~e020:2
  • (新)敵キャラの移動:画面上から下方向に直進する

ここまでの成果

敵に5回当たると「GAME OVER」が表示されます。

敗北条件の実装

「敗北条件を実装するのはそこまで難しくないでしょ」と思っていましたが、浅慮でした。

「HPが0になったらゲームオーバー」という処理は、主に以下の3つのステップで構成しています。

当たり判定とHPの減少

プレイヤーが敵(敵の弾)に接触した瞬間を、システムが検知してHPを減らす処理を行います。

  • 仕組み:UnityのOnTriggerEnter2Dを使用。
  • 処理:衝突した相手のタグを確認し、タグが敵であればダメージ計算メソッド(TakeDamage)を呼び出します。

<抜粋:敵との衝突検知>

private void OnTriggerEnter2D(Collider2D other)
    {
        // 「Enemy(敵)」または「EnemyBullet(敵の弾)」というタグがついた物に当たったか確認
        if (other.CompareTag("Enemy") || other.CompareTag("EnemyBullet"))
        {
            // ダメージ処理を呼び出す(1ダメージ)
            TakeDamage(1);

            // 敵の弾なら、当たった瞬間に消す
            if (other.CompareTag("EnemyBullet"))
            {
                Destroy(other.gameObject);
            }
        }
    }

HPの監視と分岐

ダメージを受けるたびに、プレイヤーの残り体力が「0以下」になっていないかをチェックします。

  • 処理:currentHp(現在の体力)からダメージ値を引き、その結果が 0以下 であれば、ゲームオーバー用のメソッド(GameOver)を実行します。
  • 体力が残っていれば、画面のHP表示を更新してゲームを続行します。

<抜粋:TakeDamageメソッド>

private void TakeDamage(int damage)
    {
        // HPを減算
        currentHp -= damage;

        // ダメージを受けたらHP表示(UI)を更新
        UpdateHpText();

        // HPが0以下になったらゲームオーバー処理へ
        if (currentHp <= 0)
        {
            GameOver();
        }
    }

ゲーム停止

ゲームオーバーになったタイミングで、ゲーム内の時間を停止させます。

  • ゲームオーバーが確定した瞬間、以下の2つの処理を同時に行います。
    • UIの表示:非表示にしていた「GAME OVER」などのUI画面を有効化。
    • 時間の停止:Unityの Time.timeScale を 0 に設定し、物理演算やアニメーションを含むゲーム内のすべての時間の流れをストップさせます。
private void GameOver()
    {
        // ゲームオーバーの文字(UI)を表示する
        if (gameOverUI != null)
        {
            gameOverUI.SetActive(true);
        }

        // ゲーム内の時間を止める(これが0だとUpdateなどが進まなくなる)
        Time.timeScale = 0f;
    }

以上です。

コメント

タイトルとURLをコピーしました