この記事について

UnityでのBGMや効果音(SE)の扱い方を解説します。AudioSourceとAudioClipの基本から、音量調整やループ設定、PlayOneShot、フェード処理まで、ゲームに欠かせないサウンド演出をまとめました。さらに、音が出ないときの確認点や、パフォーマンス最適化のポイントも紹介します。

説明はUnity 6.0の公式資料をもとにしています。掲載画像は元記事の画面を再利用しており、撮影時の細かなバージョンは未確認です。使用するUnityのバージョンによって、項目名や配置が異なる場合があります。

この記事でわかること

  • BGM・SEの基本的な再生方法(AudioSource / AudioClip / AudioListener)
  • Play・Stop・Pause・UnPauseとPlayOneShotの使い分け
  • 音量の変更・ループ設定・フェード処理
  • 音が出ないときの確認点
  • サウンド管理の最適化(圧縮設定・同時再生数・オーディオプール)

AudioSourceとは?

UnityのAudioSourceとは、ゲーム内で音を再生するためのコンポーネントです。
スピーカーの役割を持っていて、音声データ(AudioClip)を実際に「鳴らす」機能を担当します。たとえばBGM、効果音、環境音などを流したいときは、AudioSourceをGameObjectにアタッチして使います。

主な特徴

  • AudioClipを指定して再生
    AudioSourceに音声データを割り当てて再生します。スクリプトから差し替えることも可能です。
  • ループ再生
    BGMのように繰り返したい音は、Loopをオンにして再生します。
  • 音量・ピッチ調整
    volumeで音量、pitchで再生速度や音の高さを変えられます。
  • 3Dサウンド
    音源とリスナーの位置関係に応じて、距離による減衰や左右の聞こえ方を変えられます。

UnityのAudioSourceの使い方

AudioSource・AudioClip・AudioListenerの関係

Unityでは、AudioSource(音を再生する)とAudioClip(音のデータ)を組み合わせてサウンドを管理します。さらに、音を受け取る役割のAudioListenerも必要です。

  • AudioSource:音を再生・停止・ループするコンポーネント
  • AudioClip:WAV・MP3・OGGなどの音声ファイルをUnityへ読み込んだデータ
  • AudioListener:音を聞く位置を決めるコンポーネント。通常はMain Cameraに付いている

音声ファイルはAssets/Audio/など、わかりやすいフォルダを作って置きましょう。Audioというフォルダ名は必須ではありません。
AudioListenerは、同時に有効なものを1つにします。カメラを追加したときは、Listenerまで重複していないか確認してください。

AudioSourceの追加方法とBGMの再生

  1. 音声ファイルをProjectビューへドラッグして、AudioClipとして読み込む
  2. Hierarchyで右クリックし、「Audio → Audio Source」を選ぶ。既存のGameObjectならInspectorのAdd Componentから追加してもOK
  3. AudioSourceの「Audio Resource」へBGM用のAudioClipを割り当てる。バージョンによって「AudioClip」と表示される
  4. まずはSpatial Blendを0(2D)にし、Volumeを0より大きくする
  5. 自動再生を試す場合はPlay On Awakeをオン、繰り返すBGMならLoopもオンにする
  6. Main CameraなどのAudioListenerを確認し、Playモードで音が鳴るか確認する

BGMとSEは、最初は別々のGameObject・AudioSourceに分けると管理しやすいです。後述のスクリプトで再生タイミングを決める場合は、Play On Awakeをオフにしておきましょう。
公式の手順はAudioSourceの作成・音声の割り当てでも確認できます。

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

UnityのAudioSourceでAudio Resource・Loop・Volume・Spatial Blendなどを設定するInspector画面

よく使う項目から確認していきましょう。上の画像はAudio Resourceが未設定で、Play On Awakeがオン、Loopがオフの状態です。そのままではBGMは鳴らないので、音声を割り当てて用途に合わせて変更してください。画像と表記が違う場合は、使っているUnityのバージョンも確認しましょう。

  • Audio Resource / AudioClip:再生する音声を割り当てる欄。この記事ではAudioClipを使用する
  • Output:出力先のAudioMixerグループ。未指定でも、通常のAudioListenerへの出力で再生できる
  • Mute:音を消す。停止や一時停止とは違い、再生自体は進む
  • Play On Awake:有効になったときに自動再生する。スクリプトで開始する場合はオフにする
  • Loop:割り当てたクリップを繰り返し再生する
  • Volume:AudioSourceの音量。基本は0〜1で調整する
  • Pitch:再生速度と音の高さを変える。1が通常の速度
  • Priority:同時に鳴る音が多い場合の優先度。0が高く、256が低い。WebGLではこの優先度設定は適用されない
  • Stereo Pan:2Dサウンドの左右の定位。-1が左、0が中央、1が右

エフェクト関係の項目

  • Bypass Effects:AudioSourceに付けたフィルター効果をバイパスする。AudioMixer全体のエフェクトを無効化する設定ではない
  • Bypass Listener Effects:AudioListener側の効果をバイパスする。Mixerへ出力する場合など、経路によって適用条件がある
  • Bypass Reverb Zones:Reverb Zoneの影響を無効にする
  • Reverb Zone Mix:Reverb Zoneへ送る信号の量を調整する(0〜1.1)

各項目の細かな条件はUnity公式のAudioSource設定一覧を参照してください。

Spatial Blendと3Dサウンドの範囲

Spatial Blendは、0が2D、1が3Dです。ゲームが2Dか3Dかだけで決めず、その音をどのように聞かせたいかで使い分けます。

  • BGM・UIの決定音:カメラとの距離に左右されたくないため、3Dゲームでも2Dが基本
  • 足音・環境音・爆発音:音源の位置や距離を表現したい場合は3Dを検討する
  • Doppler Level:音源やリスナーの移動による音程変化の強さ。不要なら0にする
  • Spread:3Dのステレオ・マルチチャンネル音声の広がりを調整する
  • Min Distance:距離による減衰が始まる目安
  • Volume Rolloff / Max Distance:距離と音量の関係を決める。Max Distanceの意味は減衰方式で異なる

Max Distanceを超えれば、必ず無音になる?
Unity 6.0の現在の公式資料では、LinearはMax Distanceで音量が0になります。Customはカーブの終端値がその先も使われ、LogarithmicはMax Distanceを使わずに距離に応じた減衰が続きます。
「この距離から先は聞こえなくしたい」という場合は、Rolloffの種類とカーブを合わせて確認しましょう。

詳細:AudioSource.maxDistanceの公式説明

AudioSourceのスクリプト制御

ここからは、再生用のメソッドをスクリプトから呼び出します。各サンプルは別々に試す例です。同じAudioSourceへ複数の制御スクリプトを重ねると、再生や音量の変更が競合することがあります。

BGMを再生・停止・一時停止・再開

BGMExample.csを作成し、BGM用のAudioSourceが付いているGameObjectにアタッチしてください。AudioSourceへAudioClipを割り当て、Play On Awakeをオフ、Loopをオンにします。

using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class BGMExample : MonoBehaviour
{
    [ContextMenu("BGM/再生")]
    public void BGMStart()
    {
        GetComponent<AudioSource>().Play();
    }

    [ContextMenu("BGM/停止")]
    public void BGMStop()
    {
        GetComponent<AudioSource>().Stop();
    }

    [ContextMenu("BGM/一時停止")]
    public void BGMPause()
    {
        GetComponent<AudioSource>().Pause();
    }

    [ContextMenu("BGM/再開")]
    public void BGMUnPause()
    {
        GetComponent<AudioSource>().UnPause();
    }
}

試すときはPlayモード中に、InspectorのBGMExampleコンポーネントのメニューから「BGM → 再生」などを選びます。AudioSource側のメニューではありません。
ゲーム内では、これらのpublicメソッドをボタンやゲームイベントから呼び出してください。ボタンから呼ぶ手順は、Buttonのクリックイベントの設定で確認できます。

  • Play:クリップを再生する。再生中に繰り返し呼ぶと先頭から再生し直すため、Updateで毎フレーム呼ばない
  • Stop:再生を停止する。次にPlayすると先頭から再生する
  • Pause:再生位置を保って一時停止する
  • UnPause:一時停止した位置から再開する。Stopした音を再開するメソッドではない

停止・再開の違いは、公式のPlay・Stop・UnPauseも参考にしてください。

SE(効果音)をPlayOneShotで再生

効果音にはPlayOneShotを使うと、すでに鳴っている音を止めずに重ねて再生できます。ジャンプ音やボタンの決定音など、短い音に便利です。

SEExample.csを作成し、SE用のAudioSourceが付いたGameObjectへアタッチします。Play On AwakeとLoopをオフにし、SEExample側のJump SEへ効果音のAudioClipを割り当ててください。この例では再生するClipをメソッドに渡すため、AudioSource側のAudio Resourceは空でもかまいません。

using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class SEExample : MonoBehaviour
{
    [SerializeField] private AudioClip jumpSE;
    [SerializeField, Range(0f, 1f)] private float volumeScale = 0.7f;

    [ContextMenu("SE/再生")]
    public void PlaySE()
    {
        if (jumpSE == null)
        {
            Debug.LogWarning("Jump SEにAudioClipを設定してください。", this);
            return;
        }

        GetComponent<AudioSource>().PlayOneShot(jumpSE, volumeScale);
    }
}

Playモード中にSEExampleのメニュー → SE → 再生で試せます。ボタンから呼ぶ場合はPlaySEを登録してください。キーボード入力には依存しないので、旧Input Managerと新Input Systemの設定を切り替える必要はありません。

第2引数のvolumeScaleは、AudioSourceのVolumeに掛ける倍率です。たとえばVolumeが0.5、volumeScaleが0.7なら、その段階での倍率は0.35になります。実際の出力にはAudioMixerや距離減衰なども影響します。
PlayOneShotを連打すると音が重なり、音割れや負荷増加の原因になります。必要に応じて呼び出す間隔や同時再生数を制限しましょう。

PlayはAudioSourceに割り当てたクリップを制御し、PlayOneShotは引数で渡したクリップを重ねて鳴らせます。同じAudioSourceのVolumeや出力先は共有されるため、音ごとに別々のフェードや位置制御をしたい場合はAudioSourceを分けます。
参考:PlayOneShotの公式仕様

AudioMixerでマスター・BGM・SE音量を管理

BGMやSEをグループごとにまとめて調整したい場合はAudioMixerを使います。マスター音量・BGM音量・SE音量を分ける手順は、以下の記事を参考にしてください。

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

フェードインは音量を徐々に上げ、フェードアウトは徐々に下げる処理です。AudioSourceのvolumeを時間に合わせて変えると、BGMを自然に開始・終了できます。

このフェード処理で使うIEnumeratorやyield return nullについては、Coroutineの基本と使い方で解説しています。

BGMFadeExample.csを作成し、BGM用のAudioSourceが付いたGameObjectへアタッチしてください。AudioClipを割り当て、Play On Awakeをオフ、Loopをオンにします。
以下はフェードイン時に曲を先頭から再生する例です。先ほどのBGMExampleとは別に試してください。

using System.Collections;
using UnityEngine;

[RequireComponent(typeof(AudioSource))]
public class BGMFadeExample : MonoBehaviour
{
    [SerializeField, Min(0f)] private float duration = 2f;
    [SerializeField, Range(0f, 1f)] private float targetVolume = 0.5f;

    private AudioSource source;
    private Coroutine fade;

    private void Awake()
    {
        source = GetComponent<AudioSource>();
    }

    [ContextMenu("BGM/フェードイン")]
    public void FadeIn()
    {
        if (!Application.isPlaying || !isActiveAndEnabled) return;
        if (source.clip == null) return;

        CancelFade();
        source.volume = 0f;
        source.Play();
        BeginFade(targetVolume, false);
    }

    [ContextMenu("BGM/フェードアウト")]
    public void FadeOut()
    {
        if (!Application.isPlaying || !isActiveAndEnabled) return;
        CancelFade();
        BeginFade(0f, true);
    }

    private void BeginFade(float endVolume, bool stopAfterFade)
    {
        if (duration <= 0f)
        {
            source.volume = endVolume;
            if (stopAfterFade) source.Stop();
            return;
        }
        fade = StartCoroutine(ChangeVolume(endVolume, stopAfterFade));
    }

    private IEnumerator ChangeVolume(float endVolume, bool stopAfterFade)
    {
        float startVolume = source.volume;
        float elapsed = 0f;
        float fadeDuration = duration;

        while (elapsed < fadeDuration)
        {
            elapsed += Time.unscaledDeltaTime;
            source.volume = Mathf.Lerp(startVolume, endVolume,
                Mathf.Clamp01(elapsed / fadeDuration));
            yield return null;
        }

        source.volume = endVolume;
        if (stopAfterFade) source.Stop();
        fade = null;
    }

    private void CancelFade()
    {
        if (fade == null) return;
        StopCoroutine(fade);
        fade = null;
    }

    private void OnDisable()
    {
        CancelFade();
        if (source != null) source.Stop();
    }
}
  • Duration:フェードにかかる秒数。0なら即座に切り替える
  • Target Volume:フェードイン後の音量。毎回1へ上げず、必要な音量に設定する
  • 動かし方:Playモード中にBGMFadeExampleのメニューから「BGM → フェードイン」「BGM → フェードアウト」を選ぶ
  • 連続操作:前のフェードを止めてから、新しい処理を始める。フェードインは毎回音量0・曲の先頭から開始する

Time.unscaledDeltaTimeを使っているため、Time.timeScaleが0でもフェードは進みます。ゲームの時間停止に合わせて止めたい場合は、Time.deltaTimeを使うなど、ポーズの設計に合わせて変更してください。
この例ではコンポーネントを無効にするとフェードと再生を止めます。また、1曲の開始・終了を扱うため、2曲を同時に重ねるクロスフェードにはAudioSourceを2つ使うなど、別の構成が必要です。
参考:Time.unscaledDeltaTime

AudioSourceから音が出ないときの確認点

スクリプトを大きく変える前に、以下を順に確認してみてください。

  1. 音声の割り当て:Playで鳴らすBGMはAudioSourceのAudio Resource、上のSE例はSEExampleのJump SEに設定したか
  2. 再生の呼び出し:Play On Awakeがオフなら、PlayやPlaySEを実際に呼んでいるか。サンプルを貼るだけでは自動再生しない
  3. 音量とミュート:AudioSourceのVolume・Mute、GameビューのMute Audio、OSや出力機器の音量を確認する
  4. AudioListener:有効なListenerが1つあるか。カメラを追加したあとに重複・無効化していないか
  5. GameObjectとコンポーネント:対象が有効か。Consoleにコンパイルエラーや参照エラーが出ていないか
  6. AudioMixer:Output先のグループやMasterがミュート、極端に小さい音量になっていないか
  7. 3Dサウンド:音源とListenerの距離、Spatial Blend、Volume Rolloffを確認する。切り分けとして一度2Dにして比べる
  8. Web向けビルド:ブラウザーの自動再生制限により、最初のクリックなどのユーザー操作が必要な場合がある

「少し鳴ってすぐ止まる」「曲が先頭から進まない」場合は、UpdateなどからPlayを毎フレーム呼んでいないかも確認しましょう。
Webでの制限はUnityのWebオーディオ資料を参照してください。

サウンドの最適化

音声ファイルの圧縮とLoad Type

WAV・MP3・OGGといった元ファイルの拡張子だけで、実行時の容量や負荷は決まりません。ProjectビューでAudioClipを選び、Import SettingsのCompression FormatとLoad Typeを確認します。

  • Decompress On Load:読み込み時に展開する。短いSEで検討しやすいが、長い音ではメモリ使用量に注意する
  • Compressed In Memory:圧縮した状態でメモリに置き、再生中に展開する。メモリとCPUのバランスを確認する
  • Streaming:少しずつ読み込んで再生する。長いBGMの候補になるが、読み込み・デコードの負荷やバッファもある

音質と容量はCompression FormatやQualityでも変わります。選べる形式や実際の挙動はビルド先で異なるので、対象端末で音質・遅延・メモリを比べることが大切です。
参考:AudioClipのImport Settings

AudioSourceと同時再生数を見直す

最初はBGM用とSE用を分けて、必要な音だけ鳴らす構成で十分です。ただし、AudioSourceが1つなら負荷も1つ分、とは限りません。PlayOneShotで音を重ねると、同時に処理する音声も増えます。

  • 短いSEが連打される場面は、再生間隔や同時再生数を見直す
  • BGMを重ねないなら1つのAudioSourceから始める。クロスフェードなど、必要な演出があれば増やす
  • Unity ProfilerのAudioモジュールで、Audio Voices・DSP CPU・Total Audio Memoryなどを確認する

最適化の前後を比べて、実際に重い部分を調整しましょう。参考:Audio Profilerの見方

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

音を鳴らすたびにGameObjectをInstantiate・Destroyしていて、その生成・破棄が負荷になっている場合は、オブジェクトプールで使い回す方法があります。すでに同じAudioSourceからPlayOneShotしているだけなら、新しくプールを導入する必要があるか先に確認しましょう。

次は、AudioSourceの貸し出し・返却だけを行う小さな例です。AudioPool.csを空のGameObjectへ付け、Audio PrefabにAudioSource付きのPrefabを設定します。PrefabのPlay On Awakeはオフにしておいてください。

using System.Collections.Generic;
using UnityEngine;

public class AudioPool : MonoBehaviour
{
    [SerializeField] private AudioSource audioPrefab;
    private readonly Queue<AudioSource> pool = new Queue<AudioSource>();
    private readonly HashSet<AudioSource> inUse = new HashSet<AudioSource>();

    public AudioSource GetAudioSource()
    {
        if (audioPrefab == null) return null;

        AudioSource source = pool.Count > 0
            ? pool.Dequeue()
            : Instantiate(audioPrefab, transform);

        source.Stop();
        source.clip = null;
        source.playOnAwake = false;
        source.loop = false;
        source.gameObject.SetActive(true);
        inUse.Add(source);
        return source;
    }

    public void ReturnAudioSource(AudioSource source)
    {
        // 二重返却や、このプール以外のAudioSourceの返却を防ぐ
        if (source == null || !inUse.Remove(source)) return;

        source.Stop();
        source.clip = null;
        source.gameObject.SetActive(false);
        pool.Enqueue(source);
    }
}

呼び出す側でGetAudioSourceの戻り値がnullでないことを確認し、clipやvolume、pitch、位置などを設定してPlayします。再生が終わったらReturnAudioSourceへ返す処理も必要です。このコードだけで音の再生や自動返却は行いません。

貸し出したオブジェクトを外側からDestroyせず、必ず返却して使います。実際のゲームではプールの上限や終了時の片付け、ポーズ・ループ中の扱いも決めてください。AudioSource.Pause()で一時停止するとisPlayingもfalseになるため、それだけで終了と判断して返却しないように注意します。
プールが減らすのは主にオブジェクトの生成・破棄です。同時に鳴る音のミキシングやデコードの負荷がなくなるわけではありません。

まとめ

  • AudioSourceは音の再生、AudioClipは音声データ、AudioListenerは音を聞く側を担当する
  • BGMはLoopとPlay、短いSEはPlayOneShotを用途に合わせて使う
  • Pauseからの再開はUnPause、Stop後の再生はPlayを使う
  • BGMのフェードは音量を時間で変え、処理の重複と目標音量にも注意する
  • 音が出ないときは割り当て・呼び出し・ミュート・Listener・Mixer・距離を順に確認する
  • 最適化はImport Settingsと同時再生数を確認し、対象端末で計測する

まずはBGMとSEを1つずつ鳴らし、音量やループを調整するところから始めてみてください。グループごとの音量設定へ進むときは、前述のAudioMixerの記事も活用しましょう。