Categories: Unity

Unity:BGMと効果音をつける~公式チュートリアル 2Dシューティングに挑戦

Unity公式サイトに掲載されているチュートリアルの2Dシューティングに挑戦。今回はBGMと効果音をつけるステップを行いました。チュートリアルを進めながら変更した箇所などをピックアップしています。

前回の記事はこちら
Unity:背景と敵機のWaveを作成~公式チュートリアル 2Dシューティングに挑戦

音をつける

チュートリアルページ:音をつける
このステップの手順は次の通りです。

  1. BGMを付ける
  2. プレイヤーにショット音をつける
  3. 爆発音を付ける

プレイヤーにショット音をつける

こちらの手順で作成するスクリプト Emitter にコメントを追加。AudioSource コンポーネントを取得する処理は Start() 関数に移動しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    // スクリプト Spaceship コンポーネントを格納する変数
    Spaceship spaceship;
    // AudioSource コンポーネントを格納する変数
    AudioSource seShot;
    // ゲームのスタート時の処理
    void Start()
    {
        // Spaceshipコンポーネントを取得
        spaceship = GetComponent<Spaceship>();
        // AudioSource コンポーネントを取得
        seShot = GetComponent<AudioSource>();
        // 弾の発射処理(コルーチン Shot )を実行
        StartCoroutine("Shot");
    }

    // ゲーム実行中の繰り返し処理
    void Update()
    {
        // 右・左のデジタル入力値を x に渡す
        float x = Input.GetAxisRaw("Horizontal");
        // 上・下のデジタル入力値 y に渡す
        float y = Input.GetAxisRaw("Vertical");
        // 移動する向きを求める
        // x と y の入力値を正規化して direction に渡す
        Vector2 direction = new Vector2(x, y).normalized;
        // Spaceship コンポーネントの Move() 処理を実行
        spaceship.Move(direction);
    }

    // トリガーに入った時の処理
    // 衝突した相手の Collider2D コンポーネントを引数 c に格納
    void OnTriggerEnter2D(Collider2D c)
    {
        // レイヤー名を取得して layerName に格納
        string layerName = LayerMask.LayerToName(c.gameObject.layer);
        // レイヤー名が Bullet (Enemy) の場合
        if (layerName == "Bullet (Enemy)")
        {
            // 弾の削除
            Destroy(c.gameObject);
        }
        // レイヤー名が Bullet (Enemy) または Enemy の場合
        if (layerName == "Bullet (Enemy)" || layerName == "Enemy")
        {
            // 爆発処理
            // スクリプト Spaceship の関数 Explosion() を実行
            spaceship.Explosion();
            // プレイヤーを削除
            Destroy(gameObject);
        }
    }

    // 弾の発射処理(コルーチン)
    IEnumerator Shot()
    {
        while (true)
        {
            // 弾をプレイヤーと同じ位置/角度で作成
            spaceship.Shot(transform);
            // ショット音を鳴らす
            seShot.Play();
            // shotDelay 秒待つ
            yield return new WaitForSeconds(spaceship.shotDelay);
        }
    }
}

サウンドのオン・オフを切り替える

ブログ記事へのゲーム埋め込みにあわせてサウンドのオン/オブの切り換えができるように改造します。

トグルボタンの作成

[Hierarchy]ウィンドウ > [Create]ボタン > UI > Toggle を選択。自動的に作成された Canvas の設定を変更します。
[Inspector]ウィンドウ > Canvas > Canvas Scaler (Script) > UI Scale Mode > Scale With Screen Size に変更。
Reference Resolution X1280 / Y 720 に設定しました。

Toggle オブジェクト の名前を Toggle Audio に変更します。

トグルボタンのコンポーネントに割り当てるテクスチャを用意。
[Hierarchy]ウィンドウ > Canvas > Toggle > Background と Checkmark のスプライトテクスチャを差し替えました。

AudioMixer アセットの作成と設定

複数のオーディオソースをまとめて管理するために AudioMixer を使用します。
[Project]ウィンドウ > [Create] > AudioMixer を選択。名前は AudioMixer に変更。

オブジェクト bgm、Player そしてプレハブ Explosion の Audio Source コンポーネントの Output を Master に設定します。

これで別々のオーディオソースをミキサーでまとめてコントロールできるようになりました。

AudioMixer のボリュームをスクリプトで制御

[Project]ウィンドウ > Assets > AudioMixer をダブルクリックして [AudioMixer]ウィンドウを開きます。

グループ Master をクリックして [Inspector]ウィンドウ > Attenuation を右クリック。Expose ‘Volume (of Master)’ to Script を選択。

[AudioMixer]ウィンドウの 右上にある Exposed Parameters をクリックして スクリプトからパラメータにアクセスするための名前を入力します。今回は パラメータ名を MasterVolume にしました。

スクリプト AudioManager の作成

スクリプトを割り当てる空オブジェクトを作成します。
[Hierarchy]ウィンドウ > [Create] > Create Empty を選択。名前を AudioManager に変更。
[Project]ウィンドウ > Scripts フォルダ内にスクリプト AudioManager を作成して、作成したオブジェクト AudioManager に割り当てます。

スクリプトのコードはこのようになりました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// オーディオミキサー処理のクラスを使用する宣言
using UnityEngine.Audio;
// UI処理のクラスを使用する宣言
using UnityEngine.UI;

public class AudioManager : MonoBehaviour
{
    // オーディオミキサー アセットを格納する変数
    public AudioMixer audioMixer;
    // トグルボタンコンポーネントを格納する変数
    public Toggle toggleButton;

    //ゲーム開始時の処理
    void Start()
    {
        // オーディオミキサーのボリュームを -80db に設定(ミュート)
        //(Exposed Parameters の MasterVolume)
        audioMixer.SetFloat("MasterVolume", -80f);
    }

    // トグルボタンの切り換えで実行する処理
    public void AudioVolume(float volume)
    {
        // トグルボタンコンポーネントの IsOn 要素 が true の場合
        //(トグルボタンにチェックが入っている場合)
        if (toggleButton.isOn)
        {
            // オーディオミキサーのボリュームを変数 volume の値に設定
            //(Exposed Parameters の MasterVolume)
            audioMixer.SetFloat("MasterVolume", volume);
        }
        // トグルボタンコンポーネントの IsOn 要素 が false の場合
        //(トグルボタンにチェックが入っていない場合)
        else
        {
            // オーディオミキサーのボリュームを -80db に設定(ミュート)
            //(Exposed Parameters の MasterVolume)
            audioMixer.SetFloat("MasterVolume", -80f);
        }
    }
}

AudioManager コンポーネントの設定

作成したAudioManager コンポーネントの変数フィールドに AudioMixer アセットと UIトグルボタンを割り当てます。

トグルボタンを切り替えた際の処理を設定します。トグルオンの際のボリューム値は基準の 0db よりやや下げて -10db に設定しました。

参考サイト

AudioMixer のボリュームをスクリプトから制御する方法はこちらのWebページを参考にさせていただきました。
Unity 5で音量を調整する方法 – テラシュールブログ

音の音量調整が少し分かりにくかったので、ここにメモします。 オーディオのグループ等については、ココにメモしています。 Unity5のオーディオ機能について(1) - テラシュールブログtsubakit1.hateblo.jp 音量の調整 単純にオーディオのボリュームを調整する場合は、AudioSourceを使用します。...

WebGL

ここまでの内容を動作確認用にWebGLでビルド。ゲーム画面右下のスピーカーアイコンのクリックで音声のオン/オフを切り替えられます。
画像クリックで再生(ファイルサイズ:約7MB)

corevale