TapTapTap!!!(29)~BGM・効果音を追加する~

TapTapTap!!!(28)~アプリをバージョンアップし、動作を確認する~ では不具合の原因調査と修正を行った。今回は Unity の Asset Store から音声ファイルをダウンロードし、「TapTapTap!!!」で BGM 効果音が流れるように改良を行う。

1.Unity Asset Store からBGM をダウンロードする

Unity Asset Store からのデータダウンロードについては Unityでゲームを開発する(3)~AssetStoreを利用する~ にて記載しているため、今回は省略する。

今回、使用する BGM は SOSU MEIKYU 様の Melodious Orchestra Music を使用させていただき、効果音では StrangePulseStudio 様の Free 8bit Game Sound Effect Package を使用させていただいた。SOSU MEIKYU 様、StrangePulseStudio 様、このような素晴らしい音声をフリーで公開していただき誠にありがとうございます。

この場を借りて深く御礼申し上げます。

SOSU MEIKYU 様のサンプルについては以下の YouTube から視聴もできます。どれもすばらしい BGM ばかりなので興味がある方は一度聞いて見てはいかがでしょうか。

 

2.ゲームに BGM を追加する

Asset のインポートが完了すると [Project] タブの中にインポートした音声ファイルが追加されていることが確認できる。その後、任意の音声ファイル選択して「Main」に対してドラッグアンドドロップする。「Main」をクリックして [Inspector] タブを開き、音声ファイルが追加されていることを確認して [loop] にチェックを入れる。これでデフォルトで BGM が流れるようになる。

BGM の追加

3.ボタンタップ時に効果音を追加する

ボタンタップ時に効果音を追加するにあたって、次の場面に secen に移り変わるかと言うのが重要となる。ここでは次のシーンに移り変わる Start ボタンの処理とゲーム中のボタンの処理についてまとめていく。共通の手順としてまずは Audio Source オブジェクトを作成しなければならない。 Audio Source オブジェクトは [Game Object] > [Audio] > [Audio Source] から作成できる。

Audio Source の追加

また、Audio Source オブジェクトには流したい音声を設定する必要があり、Audio Source オブジェクトをクリック後 [Inspector] > [Audio Source] > [Audio Clip] に流したい音声を設定する。その際、 [Play On Awake] のチェックは外しておく。これをつけたままだと、起動と同時に音声が流れてしまう。

Audio Clip

3-1.Start ボタンの処理

スタートボタンの処理では次のゲーム画面に遷移するが、その際流れている音声が途中で途切れてしまう。そのため、スクリプト内で音声が流れている最中かを判定する必要がある。スクリプトについてはそれぞれ以下の通り。

スタートボタンの処理。

[cce_csharp]using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameStart : MonoBehaviour
{
    /// <summary>
    /// ゲーム開始時の音源
    /// </summary>
    [SerializeField]
    private AudioSource audioSource;
    /// <summary>
    /// Game Start ボタンタップ時の処理
    /// </summary>
    public void OnClick()
    {
        if (FindObjectOfType<LifeManager>().UseLife())
        {
            // 効果音を流す。
            audioSource.Play();
            // 効果音が鳴り終わるまで待機
            StartCoroutine(FindObjectOfType<SoundEffectWaiter>().Checking(audioSource, () =>
            {
                SceneManager.LoadScene("taptaptap");
            }));
        }
    }
}[/cce_csharp]

効果音が終わるのを待機する処理。

[cce_csharp]using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundEffectWaiter : MonoBehaviour {
    
    /// <summary>
    /// コールバック用待機関数
    /// </summary>
    public delegate void functionType();
    /// <summary>
    /// 効果音がなり終わるまで待機
    /// </summary>
    /// <param name="audio">監視する AudioSouce</param>
    /// <param name="callback">コールバックする関数</param>
    /// <returns></returns>
    public IEnumerator Checking(AudioSource audio, functionType callback)
    {
        while (true)
        {
            yield return new WaitForFixedUpdate();
            if (!audio.isPlaying)
            {
                callback();
                break;
            }
        }
    }
}[/cce_csharp]

3-2.ゲーム中のタップボタンの処理

ゲーム中のタップボタンの処理についてはスタートボタンと異なり secen が遷移することが無いので、そのまま処理を行うことができる。しかし、表示しているボタンは Prefab に登録しているため Audio Source も同様に Prefab に登録する必要がある。Prefab への登録については TapTapTap!!!(2)~ボタンを出現・消滅させる~ にて解説しているため省略する。

ゲーム中に出現するタップボタンの効果音については以下のスクリプトを用いて流している。

[cce_csharp]using UnityEngine;

public class ButtonAction : MonoBehaviour {
    /// <summary>
    /// 生成する「Tap!」テキストオブジェクト
    /// </summary>
    [SerializeField]
    private GameObject text;
    /// <summary>
    /// 「Tap!」テキストオブジェクトの削除時間
    /// </summary>
    [SerializeField]
    private float destroyTime;
    /// <summary>
    /// ボタンタップ時の効果音
    /// </summary>
    [SerializeField]
    private AudioSource audioSource;

    /// <summary>
    /// ボタンがタップされたときの処理。「Tap!」テキストの表示位置計算および表示。
    /// 自身のボタン削除を行う。
    /// </summary>
    public void OnClick() {
        audioSource = (AudioSource)Instantiate(audioSource);
        audioSource.Play();
        // 世界座標系
        Vector3 worldPosition = this.gameObject.transform.localPosition;
        // canvas オブジェクトの取得
        GameObject parent = this.gameObject.transform.root.gameObject;
        // 自身が登録されているオブジェクトを削除する
        Destroy(this.gameObject);
        audioSource.Play();
        viewTapText(parent, worldPosition);

    }

    /// <summary>
    /// 「Tap!」テキストの表示。
    /// </summary>
    /// <param name="parent">「Tap!」テキストを表示するためのキャンバス</param>
    /// <param name="position">「Tap!」の表示位置</param>
    private void viewTapText(GameObject parent,Vector3 position) {
        //指定位置のテキストを表示
        GameObject prefab = (GameObject)Instantiate(text);
        prefab.transform.position = position;
        prefab.transform.SetParent(parent.transform, false);
        Destroy(prefab, destroyTime);
    }
}[/cce_csharp]

これでゲーム中にボタンタップ音や BGM が流れるようになるはずだ。

%d人のブロガーが「いいね」をつけました。