Categories: Unity

【Unity】BGMやSEを再生する方法

この記事では、UnityでBGMやSEなどの音を鳴らす方法を解説します。

BGMを流すことで場の緊張感や楽しげな雰囲気を醸し出すことができ、SEを鳴らすことで爽快感やリアリティさを演出することができます。

Tips
  • BGM = Background Music(バックグラウンドミュージック)、背景音楽
  • SE = Sound Effects(サウンド・エフェクト)、音響効果

音を鳴らす基本

まずはゲーム内で音を鳴らすのに必要なコンポーネントやデータを確認していきましょう。

オーディオデータ AudioClip

Unity で使用するオーディオファイルは「AudioClip(オーディオクリップ)」と呼ばれています。このデータを次に紹介する AudioSourceコンポーネントに渡してサウンドを再生します。

LinkAudioClip - Unity スクリプトリファレンス

アセットストアやフリーサイトなどでダウンロードして音源を用意しましょう!

インポートできるオーディオファイル形式は「.aif、.wav、.mp3、.ogg」です。

音を再生する AudioSourceコンポーネント

音を鳴らすには AudioSourceコンポーネントを使います。

LinkAudioSource - Unity スクリプトリファレンス

音を鳴らしたいオブジェクトに AudioSourceコンポーネントをアタッチし、ゲーム開始時に再生させたり、スクリプトから再生することができます。

BGM、 SEのどちらも AudioSourcコンポーネントを用いて再生します。

音を聞く AudioListenerコンポーネント

AudioSourceコンポーネントで音を再生しただけではプレイヤーはその音を聞くことができません。プレイヤーの耳である AudioListenerコンポーネントが必要となります。

LinkAudioListener - Unity スクリプトリファレンス

AudioListenerコンポーネントはデフォルトでメインカメラにアタッチされています。

  • AudioListenerは複数設定することは推奨されていない

音を鳴らしてみる

それでは、実際に音を鳴らしてみましょう!

まずは適当なプロジェクトを作成し、その中に空オブジェクトを作成してください。作成したらそのオブジェクトに AudioSourceコンポーネントをアタッチします。

次に、AudioSourceコンポーネントのインスペクター上でオーディオクリップを設定します。ちなみに、今回はアセットストアにある「8Bit Music - 062022」を使わしてもらいました。

【Unity】アセットストアにあるアセットを追加・使用する方法この記事では、Unityのアセットストア(Asset Store)からアセットを追加し、プロジェクト内で使用する方法を解説します。ゲームにはたくさんの部品が必要になりますが、全てを1から作るとかなりの時間を要してしまいます。そんな時には、アセットを使うことで時短にもなり、クオリティも高くなることが多いです。...

そしたら、「PlayOnAwake(ゲーム開始時に再生)」にチェックが入っているか確認し、ゲームを再生してみてください。

これで渡したオーディオクリップが再生されました。

BGM

BGMを再生する場合は、「Loop(ループ)」にチェックをし、「SpatialBlend(立体音響ブレンド)」を「0」にします。

Loop ループ再生するかどうか
SpatialBlend 3D立体化の計算(減衰やドップラーなど)によってどのくらい影響を受けるか設定します。 「0.0」は音を完全に「2D」にし、「1.0」は完全に「3D」になる

BGMをループ再生し、位置関係によってボリュームが変わらないように設定できます。

スクリプトからBGMを再生する

スクリプトからBGMを再生するには、AudioSourcePlay()を呼び出します。

using UnityEngine;

public class Sound : MonoBehaviour
{
    private AudioSource audioSource;

    void Start()
    {
        // AudioSource コンポーネントの取得
        audioSource = GetComponent<AudioSource>();
        
        // 再生
        audioSource.Play();
    }
}

LinkAudioSource-Play - Unity スクリプトリファレンス

曲を変更する

途中で曲を変更したい場合は、AudioSourceClipを変更してから再生するだけです。

using UnityEngine;

public class Sound : MonoBehaviour
{
    private AudioSource audioSource;

    // 複数のBGMを受け取っておく
    [SerializeField]
    private AudioClip[] clips;

    void Start()
    {
        // AudioSource コンポーネントの取得
        audioSource = GetComponent<AudioSource>();
        
        // 曲の変更(clipsからランダムに選ばれる)
        audioSource.clip = clips[Random.Range(0, clips.Length)];

        // 再生
        audioSource.Play();
    }
}

LinkAudioSource-clip - Unity スクリプトリファレンス

BGMを途切らせない

シーンを遷移する際にオブジェクトが削除されてしまうのでBGMが途切れてしまう。つまりは削除されないようにすればBGMは途切れることがなくなります。

シーンを遷移しても削除されないようにするにはDontDestroyOnLoad()を使います。

using UnityEngine;

public class Sound : MonoBehaviour
{
    void Start()
    {
                // 引数に指定したオブジェクトを削除されないように設定できる
        DontDestroyOnLoad(this);
    }
}

SE

SEを再生する場合は、AudioSorce の設定を以下のように変更します。

  • オーディオクリップは設定しておかない
  • 「Loop(ループ)」と「PlayOnAwake(ゲーム開始時に再生)」のチェックを外す
  • 「SpatialBlend(立体音響ブレンド)」は状況によって変更する

そしたら以下のようなスクリプトを作成し、アタッチしてください。

using UnityEngine;

public class Sound : MonoBehaviour
{
    private AudioSource audioSource;

    // SEを受け取っておく
    [SerializeField]
    private AudioClip se;

    void Start()
    {
        // AudioSource コンポーネントの取得
        audioSource = GetComponent<AudioSource>();
    }

    private void Update() 
    {
        // 左クリックした場合
        if(Input.GetMouseButtonUp(0))
        {
            // 引数のクリップを再生
            audioSource.PlayOneShot(se);
        }
    }
}

後はインスペクター上で再生したSEを渡しておきます。

ゲームを実行し、左クリックを押してみてください。
SEが再生されたと思います。

ポイントはSEの再生にはPlayOneShot()を使うことです。BGMの再生に使うPlay()と違って重ねて再生することができます。

LinkAudioSource-PlayOneShot - Unity スクリプトリファレンス

まとめ

この記事では、BGMやSEなどの音を鳴らす方法を解説しました。

サウンドがないゲームはとても寂しいものになってしまいます。なので、適切にBGMやSEを流して楽しいゲームにしちゃいましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago