Unity公式サイトに掲載されているチュートリアルの2Dシューティングに挑戦。今回はBGMと効果音をつけるステップを行いました。チュートリアルを進めながら変更した箇所などをピックアップしています。
前回の記事はこちら
Unity:背景と敵機のWaveを作成~公式チュートリアル 2Dシューティングに挑戦
チュートリアルページ:音をつける
このステップの手順は次の通りです。
こちらの手順で作成するスクリプト 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); } } }
ブログ記事へのゲーム埋め込みにあわせてサウンドのオン/オブの切り換えができるように改造します。
Toggle オブジェクト の名前を Toggle Audio に変更します。
トグルボタンのコンポーネントに割り当てるテクスチャを用意。
[Hierarchy]ウィンドウ > Canvas > Toggle > Background と Checkmark のスプライトテクスチャを差し替えました。
複数のオーディオソースをまとめて管理するために AudioMixer を使用します。
[Project]ウィンドウ > [Create] > AudioMixer を選択。名前は AudioMixer に変更。
オブジェクト bgm、Player そしてプレハブ Explosion の Audio Source コンポーネントの Output を Master に設定します。
これで別々のオーディオソースをミキサーでまとめてコントロールできるようになりました。
グループ Master をクリックして [Inspector]ウィンドウ > Attenuation を右クリック。Expose ‘Volume (of Master)’ to Script を選択。
[AudioMixer]ウィンドウの 右上にある Exposed Parameters をクリックして スクリプトからパラメータにアクセスするための名前を入力します。今回は パラメータ名を MasterVolume にしました。
スクリプトを割り当てる空オブジェクトを作成します。
[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 コンポーネントの変数フィールドに AudioMixer アセットと UIトグルボタンを割り当てます。
トグルボタンを切り替えた際の処理を設定します。トグルオンの際のボリューム値は基準の 0db よりやや下げて -10db に設定しました。
AudioMixer のボリュームをスクリプトから制御する方法はこちらのWebページを参考にさせていただきました。
Unity 5で音量を調整する方法 – テラシュールブログ
ここまでの内容を動作確認用にWebGLでビルド。ゲーム画面右下のスピーカーアイコンのクリックで音声のオン/オフを切り替えられます。
画像クリックで再生(ファイルサイズ:約7MB)