敵ウェーブ~横スクロールシューティング⑤

Unity

●はじめに

2D横スクロールシューティング作成の5回目になります。
アセットストアで無料公開されている「Warped Space Shooter」をお借りして作成しています。

今回は「敵ウェーブ」を作成し、遊べる形にします。

 ↑これが完成します。

●敵ウェーブ作成

▷ウェーブ作成準備

敵ウェーブ作成の準備完了
敵ウェーブ作成の準備完了

・解説

ウェーブを作成するための準備を行います。

・手順

敵をプレハブ化し、隕石をヒエラルキーから削除します。

  1. ヒエラルキーの「enemy1」をプロジェクトの「Assets」にドラッグ&ドロップ
  2. ヒエラルキーの「enemy1」をクリック
  3. Deleteキーを押す
  4. ヒエラルキーの「asteroid-small」をクリック
  5. Deleteキーを押す
  6. ヒエラルキーの「asteroid」をクリック
  7. Deleteキーを押す

▷前進する敵5機

敵ウェーブA作成
敵ウェーブA作成
前進する敵5機
前進する敵5機

・解説

前進のみ行う敵を横に5機、上側に並べたウェーブ「waveA」を作成します。

・手順

空オブジェクトの子として敵プレハブを5機、上の方に配置します。

  1. ヒエラルキーの左上にある「+」をクリックし、「空のオブジェクトを作成」をクリック
  2. 「waveA」と入力してENTERを押す
  3. インスペクターの「Transform>位置」に(0, 0, 0)を入力
  4. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveA」にドラッグ&ドロップ
  5. CTRLを押しながらDキーを押す
  6. CTRLを押しながらDキーを押す
  7. CTRLを押しながらDキーを押す
  8. CTRLを押しながらDキーを押す
  9. SHIFTを押しながらヒエラルキーの「waveA>enemy1」をクリック
  10. インスペクターの「Transform>位置>Y」に(3)を入力
  11. インスペクターの「Transform>位置>X」に(#*-3+24)を入力
  12. インスペクターの「Enemy(スクリプト)>Cycle Count」に(0)を入力
  13. インスペクターの「Enemy(スクリプト)>Curve Length」に(0)を入力

weveAをプレハブ化し、ヒエラルキーから削除します。

  1. ヒエラルキーの「waveA」をプロジェクトの「Assets」にドラッグ&ドロップ
  2. ヒエラルキーの「waveA」をクリック
  3. DELETEキーを押す

▷浮遊する隕石3つ

敵ウェーブB作成
敵ウェーブB作成
浮遊する隕石3つ
浮遊する隕石3つ

・解説

上端、下端から画面内に向かって進む隕石を3つ配置します。

・手順

空オブジェクトを作成し、敵プレハブを配置してインスペクターを設定します。

  1. ヒエラルキーの左上にある「+」をクリックし、「空のオブジェクトを作成」をクリック
  2. 「waveB」と入力してENTERを押す
  3. インスペクターの「Transform>位置」に(0, 0, 0)を入力
  4. プロジェクトの「Assets>asteroid」をヒエラルキーの「waveB」にドラッグ&ドロップ
  5. インスペクターの「Transform>位置>X」に(-1)を入力
  6. インスペクターの「Transform>位置>Y」に(5)を入力
  7. インスペクターの「Enemy(スクリプト)>Random Min Dir」に(45)を入力
  8. インスペクターの「Enemy(スクリプト)>Random Max Dir」に(90)を入力

waveB内のasteroidを複製・調整します。

  1. ヒエラルキーの「waveB>asteroid」をクリック
  2. CTRLを押しながらDキーを押す
  3. インスペクターの「Transform>位置>X」に(3)を入力
  4. インスペクターの「Transform>位置>Y」に(-5.5)を入力
  5. インスペクターの「Enemy(スクリプト)>Random Min Dir」に(270)を入力
  6. インスペクターの「Enemy(スクリプト)>Random Max Dir」に(315)を入力
  7. ヒエラルキーの「waveB>asteroid (1)」をクリック
  8. CTRLを押しながらDキーを押す
  9. インスペクターの「Transform>位置>X」に(7)を入力
  10. インスペクターの「Transform>位置>Y」に(6)を入力
  11. インスペクターの「Enemy(スクリプト)>Random Min Dir」に(45)を入力
  12. インスペクターの「Enemy(スクリプト)>Random Max Dir」に(90)を入力

weveBをプレハブ化し、ヒエラルキーから削除します。

  1. ヒエラルキーの「waveB」をプロジェクトの「Assets」にドラッグ&ドロップ
  2. ヒエラルキーの「waveB」をクリック
  3. DELETEキーを押す

▷前進する敵5機②

敵ウェーブC作成
敵ウェーブC作成
前進する敵5機②
前進する敵5機②

・解説

前進のみ行う敵を横に5機、下側に並べたウェーブ「waveC」を作成します。

・手順

waveAを複製し、敵5機を下側へ移動させます。

  1. プロジェクトの「Assets>waveA」をクリック
  2. CTRLを押しながらDキーを押す
  3. F2キーを押し、「waveC」と入力してENTERを押す
  4. プロジェクトの「Assets>waveC」をダブルクリック
  5. ヒエラルキーの「waveC>enemy1」をクリック
  6. SHIFTキーを押しながらヒエラルキーの「waveC>enemy1 (4)」をクリック
  7. インスペクターの「Transform>位置>Y」に(-3)を入力
  8. ヒエラルキー左上の「<」をクリック

▷カーブ前進する敵と大きな敵

敵ウェーブD作成
敵ウェーブD作成
カーブ前進する敵と大きな敵
カーブ前進する敵と大きな敵

・解説

カーブする敵6機と、前進する大きな敵を配置したウェーブ「waveD」を作成します。

・手順

空オブジェクトを作成して敵プレハブを配置、大きな敵として設定します。

  1. ヒエラルキーの左上にある「+」をクリックし、「空のオブジェクトを作成」をクリック
  2. 「waveD」と入力してENTERを押す
  3. インスペクターの「Transform>位置」に(0, 0, 0)を入力
  4. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  5. インスペクターの「Transform>位置」に(24, 0, 0)を入力
  6. インスペクターの「Transform>スケール」に(12, 12, 1)を入力
  7. インスペクターの「Enemy (スクリプト)>Cycle Count」に(0)を入力
  8. インスペクターの「Enemy (スクリプト)>Curve Length」に(0)を入力
  9. インスペクターの「Hit (スクリプト)>Energy」に(30)を入力

カーブする敵を配置します。

  1. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  2. インスペクターの「Transform>位置」に(14, 0.5, 0)を入力
  3. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  4. インスペクターの「Transform>位置」に(15, -0.5, 0)を入力
  5. インスペクターの「Enemy (スクリプト)>Curve Length」に(-2)を入力
  6. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  7. インスペクターの「Transform>位置」に(17, -1.5, 0)を入力
  8. インスペクターの「Enemy (スクリプト)>Curve Length」に(-2.5)を入力
  9. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  10. インスペクターの「Transform>位置」に(18, 1.5, 0)を入力
  11. インスペクターの「Enemy (スクリプト)>Curve Length」に(2.5)を入力
  12. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  13. インスペクターの「Transform>位置」に(21, 2, 0)を入力
  14. インスペクターの「Enemy (スクリプト)>Curve Length」に(3)を入力
  15. プロジェクトの「Assets>enemy1」をヒエラルキーの「waveD」にドラッグ&ドロップ
  16. インスペクターの「Transform>位置」に(22, -2, 0)を入力
  17. インスペクターの「Enemy (スクリプト)>Curve Length」に(-3)を入力

weveDをプレハブ化し、ヒエラルキーから削除します。

  1. ヒエラルキーの「waveD」をプロジェクトの「Assets」にドラッグ&ドロップ
  2. ヒエラルキーの「waveD」をクリック
  3. DELETEキーを押す

●ウェーブ制御

▷キャラクターが動ける範囲の作成

敵ウェーブ管理のインスペクター情報
敵ウェーブ管理のインスペクター情報
キャラクターが動ける範囲
キャラクターが動ける範囲

・解説

ウェーブ管理スクリプト用に空のオブジェクトを作成し、
BoxColliderを使って画面外に出たキャラクターを判断できるようにします。

最初は動ける範囲内に既にいるため、スクリプト「Hit」で衝突してしまいます。
スクリプト「Hit」での竈突はタグを使って回避します。

・手順

空ゲームオブジェクトして位置を調整、

  1. ヒエラルキー左上にある「+」をクリックし、「空のオブジェクトを作成」をクリックします。
  2. 「WaveController」と入力し、ENTERを押す
  3. インスペクターの「Transform>位置」に(0, 0, 0)を入力

BoxCollider2Dを割り当て、

  1. インスペクター下部にある「コンポーネントを追加」をクリック
  2. 「Physics 2D>Box Collider 2D」をクリック

BoxCollider2Dを設定します。

  1. インスペクターの「Box Collider 2D>トリガーにする」のチェックを入れる
  2. インスペクターの「Box Collider 2D>サイズ」に(18, 10)を入力

タグ「WaveController」を作成、設定します。

  1. インスペクター上部のタグドロップダウンをクリック
  2. 「タグを追加…」をクリック
  3. インスペクターのタグ欄右下にある「+」をクリック
  4. 「WaveController」と入力してENTERを押す
  5. ヒエラルキーの「WaveController」をクリック
  6. インスペクター上部のタグドロップダウンをクリック
  7. 「WaveController」をクリック

スクリプト「Hit」の衝突処理でウェーブ管理と衝突しないようにします。

  1. プロジェクトの「Assets>Hit」をダブルクリック
  2. OnTriggerEnter2D関数内の最初に以下の処理を追加
        // ウェーブ管理とは衝突させない
        if (collider.gameObject.tag == "WaveController")
        {
            return;
        }

▷動ける範囲を出たら削除

弾が緑枠外に出ると消える
弾が緑枠外に出ると消える

・解説

画面外に出たら敵や弾を削除するスクリプトを作成します。

・手順

敵ウェーブを管理する変数を作成します。

  1. プロジェクトの「Assets」を右クリックし、「作成>C# スクリプト」をクリック
  2. 「WaveController」と入力してENTERを押す
  3. プロジェクトの「Assets>WaveController」をヒエラルキーの「WaveController」にドラッグ&ドロップ
  4. プロジェクトの「Assets>WaveController」をダブルクリック
  5. Start関数の前に以下の変数を追加
    public List<GameObject> waves;              // ウェーブ一覧

    int nextWaveIndex = 0;                      // 次のウェーブ位置
    GameObject currentWave;                     // 現在のウェーブ
    Vector3 hidePos;                            // カメラの後ろ位置

弾をカメラの後ろ位置へ移動するため、Startでカメラ後ろ位置を計算しておきます。

  1. Start関数内に以下の処理を追加
        // カメラの後ろ位置
        hidePos = Camera.main.transform.position - Camera.main.transform.forward;

敵が居なくなったら次のウェーブを作成する処理を作成します。
最後のウェーブだった場合、敵ウェーブ総数で割った余りを次に作成するウェーブ番号とします。
結果、敵ウェーブを永久に繰り返すようになります。

  1. Update関数内に以下の処理を追加
        // ウェーブが無い、もしくは敵が居なくなった場合
        if (currentWave == null || currentWave.transform.childCount == 0)
        {
            // ウェーブ作成
            currentWave = Instantiate(waves[nextWaveIndex]);
            // 次のウェーブ位置を計算
            nextWaveIndex++;
            // ウェーブ総数以上になったら繰り返すように余りを求める
            nextWaveIndex %= waves.Count;
        }

動ける範囲の外に出たオブジェクトを削除する処理を追加します。
弾は削除すると発射されなくなるので、カメラの後ろに隠すようにします。
弾かどうかはHitスクリプトが有るか無いかで判断しています。

  1. Update関数の次に以下の関数を追加
    // トリガーの外に出たら処理
    void OnTriggerExit2D(Collider2D obj)
    {
        // Hitスクリプトを持っていなかったら弾と判断
        Hit hit = obj.gameObject.GetComponent<Hit>();
        if (hit == null)
        {
            // カメラの後ろに隠す
            obj.gameObject.transform.position = hidePos;
        }
        else
        {
            // 削除
            Destroy(obj.gameObject);
        }
    }

スクリプトを保存してビルドします。

  1. CTRLを押しながらSキーを押してスクリプト保存
  2. Unityエディタをクリックしてビルド

▷敵ウェーブ配置

敵ウェーブが繰り返し出現する
敵ウェーブが繰り返し出現する

・解説

敵ウェーブが順に表示されるように設定します。

・手順

WaveControllerのWavesに敵ウェーブをABCDの順で登録します。

  1. ヒエラルキーの「WaveController」をクリック
  2. プロジェクトの「Assets>waveA」をインスペクターの「Wave Controller (スクリプト)>Waves」にドラッグ&ドロップ
  3. プロジェクトの「Assets>waveB」をインスペクターの「Wave Controller (スクリプト)>Waves」にドラッグ&ドロップ
  4. プロジェクトの「Assets>waveC」をインスペクターの「Wave Controller (スクリプト)>Waves」にドラッグ&ドロップ
  5. プロジェクトの「Assets>waveD」をインスペクターの「Wave Controller (スクリプト)>Waves」にドラッグ&ドロップ

プロジェクトを保存して動作を確認します。

  1. CTRLを押しながらSキーを押してプロジェクト保存
  2. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
  3. 各種ウェーブが順番に登場することを確認
  4. waveDが終了したらwaveAに戻ってループすることを確認
  5. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了

●完成

シューティングとして遊べる形になりました。

次回はスコア制御を作って完成とします。
ゲームオーバーやタイトル、クリア等は気が向いたら作ります。

コメント

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