オーディオ~横スクロールシューティング③

Unity

●はじめに

今回のメインはオーディオです。

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

「自機のやられ、BGM再生、効果音再生」を作成し、シューティングっぽくなるようにします。

 ↑これが完成する。

●自機のやられ

▷自機の衝突設定

player1のインスペクター情報
player1のインスペクター情報
体当たりで自機が消える、そしてバグ
体当たりで自機が消える、そしてバグ

・解説

Hitスクリプトを設定し、1撃でやられるようEnergyに(1)を設定します。
Rigidbody2Dを割り当てて重力スケールを(0)、衝突判定を(連続的)とし、
CircleCollider2Dを割り当ててオフセットXを(0.05)、半径を(0.05)とします。

・手順

スクリプトを割り当てます。

  1. 「Assets>Hit」をヒエラルキーの「Player1」にドラッグ&ドロップ
  2. インスペクターの「Hit (スクリプト)>Energy」に(1)を入力

Rigidbody 2Dを割り当てます。

  1. インスペクターの「コンポーネントを追加」をクリック
  2. 「Physics 2D>Rigidbody 2D」をクリック
  3. インスペクターの「Rigidbody 2D>重力スケール」に(0)を入力
  4. インスペクターの「Rigidbody 2D>衝突判定」を(連続的)に変更

Circle Collider 2Dを割り当てます。

  1. インスペクターの「コンポーネントを追加」をクリック
  2. 「Physics 2D>Circle Collider 2D」をクリック
  3. インスペクターの「Circle Collider 2D>トリガーにする」をチェック
  4. インスペクターの「Circle Collider 2D>オフセット>X」に(0.05)を入力
  5. インスペクターの「Circle Collider 2D>半径」を(0.05)に変更

・動作確認

  1. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
  2. 敵に体当たりしたら自機が爆発することを確認
  3. 自機が爆発したら自機の弾が停止するバグが発生することを確認…
  4. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了

▷弾を加速度で動かす

shoot1プレハブのインスペクター情報
shoot1プレハブのインスペクター情報
自機がやられても弾が止まらない
自機がやられても弾が止まらない

・解説

弾が停止しないよう弾にRigidbody2Dを割り当てて加速度を与え、自分で動くようにします。

・手順

  1. プロジェクトの「Assets>Player」をダブルクリック
  2. Start関数の繰り返し処理内にある「プレハブから弾を作成」の処理の後に以下の処理を追加
            // リジッドボディの加速度を指定
            Rigidbody2D rb = shotList[i].GetComponent<Rigidbody2D>();
            rb.velocity = transform.right * shotSpeed;
  1. FixedUpdateの最後にある「弾移動(どうせ見えないので全部動かす)」処理を削除

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

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

弾にRigidbody 2Dを設定します。

  1. プロジェクトの「Assets>shoot1」をダブルクリック
  2. インスペクターの「コンポーネントを追加」をクリック
  3. 「Physics 2D>Rigidbody 2D」をクリック
  4. インスペクターの「Rigidbody 2D>重力スケール」に(0)を入力
  5. インスペクターの「Rigidbody 2D>衝突判定」を(連続的)に変更
  6. ヒエラルキー左上の「<」をクリックしてプレハブ編集を終了

動作を確認します。

  1. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
  2. 敵に体当たりして爆発しても弾が停止しないことを確認
  3. 自機の弾に体当たりしても爆発することを確認
  4. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了

▷タグで衝突を制御

自機の弾に当たっても爆発しない
自機の弾に当たっても爆発しない
自機の弾に当たっても爆発しない
自機の弾に当たっても爆発しない

・解説

自機の弾は誰と衝突しても破壊できる状態です。
自機と自機の弾にPlayerタグを割り当て、自分と同じタグの場合は衝突しないようスクリプトを修正します。

・手順

自機のタグを「Player」にします。

  1. ヒエラルキーの「Player1」をクリック
  2. インスペクターのタグを「Player」に変更

自機の弾のタグを「Player」にします。

  1. プロジェクトの「Assets>shoot1」をダブルクリック
  2. インスペクターのタグを「Player」に変更
  3. ヒエラルキー左上の「<」をクリックしてプレハブ編集を終了

タグが同じ場合は衝突しないように条件を追加します。

  1. プロジェクトの「Assets>Hit」をダブルクリック
  2. OnTriggerEnter2D関数の先頭に以下の処理を追加
        // タグが同じ場合は衝突させない
        if (tag == collider.gameObject.tag) {
            return;
        }
  1. CTRLを押しながらSキーを押してスクリプト保存
  2. Unityエディタをクリックしてビルド

プロジェクトを保存して、

  1. CTRLを押しながらSキーを押してプロジェクト保存

動作を確認します。

  1. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
  2. 敵に弾を当てて倒せることを確認
  3. 自分の弾に当たっても爆発しないことを確認
  4. 再度プレビューし、敵への体当たりで爆発することを確認
  5. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了

●オーディオ制御

▷BGM設定

オーディオインポート設定
オーディオのインポート設定
BGMのインスペクター情報
BGMのインスペクター情報

・解説

オーディオ機能を使ってBGMを鳴らします。

・手順

BGMに合ったインポート設定に調整します。

  1. プロジェクトの「Assets>Space Shooter Assets>Artwork>music>space-asteroids.ogg」をクリック
  2. インスペクターの「バックグラウンドで実行」をチェック
  3. インスペクターの「デフォルト>ロードタイプ」を「ストリーミング」に変更
  4. インスペクターの「適用する」をクリック

ヒエラルキーに配置してBGM再生します。

  1. プロジェクトの「Assets>Space Shooter Assets>Artwork>music>space-asteroids.ogg」をヒエラルキーにドラッグ&ドロップ
  2. F2キーを押して「BGM」と入力し、ENTERを押す
  3. インスペクターの「Audio Source>ループ」にチェックを入れる

・動作確認

  1. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
  2. BGMが再生されることを確認
  3. BGMがループすることを確認
  4. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了

▷効果音再生制御

オーディオインポート設定
オーディオのインポート設定
効果音ゲームオブジェクト3つのインスペクター情報
効果音ゲームオブジェクト3つのインスペクター情報

・解説

効果音を再生するためのスクリプトを作成します。
効果音再生にはオーディオ機能だけでなく、スクリプトも必要になります。

・手順

効果音を3つ、効果音に合ったインポート設定に調整します。

  1. プロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>explosion」をクリック
  2. SHIFTを押しながらプロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>shot 1」をクリック
  3. インスペクターの「Mono に強制」をチェック
  4. インスペクターの「適用する」をクリック

ヒエラルキーに効果音を配置し、開始時に再生しないように設定します。

  1. プロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>explosion」をクリック
  2. SHIFTを押しながらプロジェクトの「Assets>Space Shooter Assets>Artwork>Sound FX>shot 1」をクリック
  3. プロジェクトで選択中のアセットをヒエラルキーの「Sample Scene」にドラッグ&ドロップ
  4. インスペクターの「Audio Source>ゲーム開始時に再生」にあるチェックを外す
  5. インスペクターの「Audio Source>ボリューム」を(0.5)に設定
  6. ヒエラルキーで選択中のゲームオブジェクトをヒエラルキーの「GameController」にドラッグ&ドロップ

ゲーム管理にオーディオソースを管理させます。

  1. プロジェクトの「Assets>GameController」をダブルクリック
  2. Start関数の前に以下の変数を追加
    // オーディオソース一覧
    public List<AudioSource> audioSrcList = new List<AudioSource>();

ゲーム管理に効果音再生の機能を追加します。

  1. playEffect関数の次に以下の関数を追加
    // 効果音再生
    public void playSE(string clipName)
    {
        // オーディオクリップ一覧から指定されたと一致するオーディオクリップを取得
        AudioSource audioSrc = audioSrcList.Find(item => item.clip.name == clipName);
        // オーディオクリップが見つかった場合
        if (audioSrc != null)
        {
            // オーディオ再生
            audioSrc.Play();
        }
    }
  1. CTRLを押しながらSキーを押してスクリプト保存
  2. Unityエディタをクリックしてビルド

命中した時に効果音を再生します。

  1. プロジェクトの「Assets>Hit」をダブルクリック
  2. 命中エフェクト再生の前に以下の処理を追加
            // 命中音再生
            gameController.playSE("hit");

爆発した時に効果音を再生します。

  1. 爆発エフェクト再生の前に以下の処理を追加
            // 爆発音再生
            gameController.playSE("explosion");
  1. CTRLを押しながらSキーを押してスクリプト保存
  2. Unityエディタをクリックしてビルド

弾を発射した時に効果音を再生するため、Playerスクリプトを修正します。

  1. プロジェクトの「Assets>Player」をダブルクリック
  2. Start関数の前に以下の処理を追加
    GameController gameController;      // ゲーム管理オブジェクト
  1. Start関数の最後の処理として以下を追加
        // ゲーム管理オブジェクトを取得
        GameObject[] gameObjects = GameObject.FindGameObjectsWithTag("GameController");
        gameController = gameObjects[0].GetComponent<GameController>();
  1. FixedUpdate関数内の「発射効果を表示」の前に以下の処理を追加
            // 発射音再生
            gameController.playSE("shot 1");
  1. CTRLを押しながらSキーを押してスクリプト保存
  2. Unityエディタをクリックしてビルド

プロジェクトを保存して、

  1. CTRLを押しながらSキーを押してプロジェクト保存

動作を確認します。

  1. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー開始
  2. 弾発射のタイミングで発射音が再生されることを確認
  3. 弾が敵に命中した時に命中音が再生されることを確認
  4. 弾が爆発した時に爆発音が再生されることを確認
  5. Unityエディタ上部中央のPlayボタンをクリックしてプレビュー終了

●完成

敵にやられ、BGMと効果音も再生されるようになりました。
スコアは表示できませんでしたが、だいぶシューティングっぽくなったかな?

次回は「スコア表示、アステロイド作成」を実施しようと思います。

コメント

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