Unity入門

【Unity】BGM・SEの使い方|ミュート、ループ、音量・音程、再生、停止、スクリプト

Unityでゲームを作る際、BGM(音楽)やSE(効果音)はゲームの雰囲気を大きく左右します。

  • BGMをシーンごとに切り替えたい!
  • 攻撃やジャンプのSE(効果音)を追加したい!
  • 音量を変更したり、フェードイン・フェードアウトを実現したい!

UnityをAudioSource活用すれば、簡単なBGMやSEを制御できます!
この記事では、基本的な音の再生方法から、BGMのループ管理、フェード処理、最適化のテクニックまで詳しく解説します!

この記事でわかること

  • BGM・SEの基本的な再生方法(AudioSource / AudioClip)
  • 音量の変更・ループ設定・フェード処理
  • 効果音をスクリプトで制御する方法
  • サウンド管理の最適化(オーディオプール・負荷軽減)

UnityのBGM・SEの使い方

AudioSourceとAudioClipの関係

Unityでは、AudioSource(音を再生する)とAudioClip(音のデータ)を組み合わせてサウンドを管理します。

AudioClipはAssets/Audio/などに保存!(フォルダは作成しましょう)
AudioSource にAudioClipを追加してサウンドを再生!

項目役割
Audio Source音を再生・停止・ループするコンポーネント
AudioClip音のデータ(WAV、MP3、OGGなど)

AudioSourceの追加方法

① Hierarchy から追加

・ [Hierarchie] → [右クリック] → [Audio] → [Audio Source] を選択
 AudioSourceオブジェクトがシーンに追加される

※ この他にも以下のサイトを参考にしてください。

AudioSourceの構成要素(ミュート、ループ、音量・音程)

Unity AudioSourceの設定の画像
設定項目説明主な用途
Audio Resource再生する音声ファイルを設定効果音やBGMを設定
OutputAudio Mixer(音の管理) に接続する音量やエフェクトをMixerで調整したいとき
Mute音をミュート(消音)する特定の条件で音を無効化
Play On Awakeシーン開始時に自動再生 する
※ シーン開始時はStart関数も起動するためスクリプトで設定することを推奨
ゲーム開始時にBGMを流したいとき
Loopループ再生する
※ BGMの時はチェック
  SEの時はチェックなし
BGMや環境音を繰り返し再生
Volume音量(0.0 ~ 1.0)音の大きさを調整
Pitch音程高音・低音の変化をつけたいとき
Spatial Blend2D / 3D の音のバランス
※ 2D:0 、3D:1
3Dゲームで距離による音の変化をつける
Doppler Levelドップラー効果(音の速さ変化)車や飛行機など、移動する音にリアル感を出す
Spread音の広がり(3D音響用)音がどれくらい広がるか調整
Min / Max Distance音が聞こえる範囲3D 音響で音の届く距離を設定

スクリプトでBGMを再生・停止・一時停止・再開

スクリプトで制御すれば、BGMの切り替えが簡単に!
※ AudioSourceのAudio ResourceにAudioClipをアタッチしてください

using UnityEngine;

public class BGMExample : MonoBehaviour
{
    public AudioSource audioSource;

    //BGMを開始
    void BGMStart()
    {
        audioSource.Play();
    }
    //BGMを停止
    void BGMStop()
    {
        audioSource.Stop();
    }
    //BGMを一時停止
    void BGMPause()
    {
        audioSource.Pause();
    }
    //BGMを再開
    void BGMUnPause()
    {
        audioSource.UnPause();
    }
}

SE(効果音)を再生する

効果音はアクション(ジャンプ・攻撃・クリック)に応答して再生するのが基本です。

効果音をスクリプトで再生

PlayOneShot()を使うと、他の音と重ねて再生可能!

public AudioSource audioSource;
public AudioClip jumpSE;

void Update()
{
    //「Space」キーを押すとSEが流れる
    if (Input.GetKeyDown(KeyCode.Space))
    {
        audioSource.PlayOneShot(jumpSE);
    }
}

複数のSEを管理する(サウンドマネージャー)

複数のSEを管理するために、サウンドマネージャーを作成すると便利!
※ Sound Managerというオブジェクトを作成してこのスクリプトをアタッチしておくとシーンが切り替わっても使用できます!

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;
    public AudioSource audioSource;
    public AudioClip jumpSE;
    public AudioClip hitSE;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    public void PlaySE(AudioClip clip)
    {
        audioSource.PlayOneShot(clip);
    }
}

サウンドマネージャーの使い方

➡ グローバル管理することで、どこからでもSEを再生可能!

SoundManager.instance.PlaySE(SoundManager.instance.jumpSE);

BGMのフェードイン・フェードアウト

BGMをスムーズに行うために、音量を少しずつ変更するテクニック。

フェードイン

最初に音量0から、徐々にBGMを再生します!

IEnumerator FadeInBGM(AudioSource source, float duration)
{
    float time = 0;
    while (time < duration)
    {
        source.volume = Mathf.Lerp(0, 1, time / duration);
        time += Time.deltaTime;
        yield return null;
    }
    source.volume = 1;
}

フェードアウト

BGMをスムーズに演出に最適!

IEnumerator FadeOutBGM(AudioSource source, float duration)
{
    float time = 0;
    float startVolume = source.volume;

    while (time < duration)
    {
        source.volume = Mathf.Lerp(startVolume, 0, time / duration);
        time += Time.deltaTime;
        yield return null;
    }
    source.Stop();
    source.volume = startVolume;
}

サウンドの最適化

音声ファイルの圧縮

MP3 / OGGを使うとファイルサイズを削減できる!
WAVは高いですが、サイズが大きいので注意してください!

AudioSourceを減らしてパフォーマンス向上

BGM用はAudioSource1つだけする!
SEはPlayOneShot()使って複数再生!

サウンドオブジェクトをプールする

Instantiate()/Destroy()は負荷が大きいため、オブジェクトプールを活用します。
この方法は有効性が不明なため参考程度にお願いします。

オブジェクトプールを活用すると、サウンド再生の負荷を軽減できる!

using System.Collections.Generic;
using UnityEngine;

public class AudioPool : MonoBehaviour
{
    public AudioSource audioPrefab;
    private Queue<AudioSource> pool = new Queue<AudioSource>();

    public AudioSource GetAudioSource()
    {
        if (pool.Count > 0)
        {
            AudioSource source = pool.Dequeue();
            source.gameObject.SetActive(true);
            return source;
        }
        return Instantiate(audioPrefab);
    }

    public void ReturnAudioSource(AudioSource source)
    {
        source.gameObject.SetActive(false);
        pool.Enqueue(source);
    }
}

まとめ

AudioSource+AudioClipを使えば簡単にBGMやSEを再生できる!
BGMはloop = true、SEはPlayOneShot()を活用!
フェード処理を実現すれば、スムーズなBGM切り替えが可能!
オーディオの最適化(ファイル圧縮・プーリング)で負荷を軽減!