【Unity】AudioSourceの使い方|BGM・SE・PlayOneShot・フェード
この記事について
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の再生
- 音声ファイルをProjectビューへドラッグして、AudioClipとして読み込む
- Hierarchyで右クリックし、「Audio → Audio Source」を選ぶ。既存のGameObjectならInspectorのAdd Componentから追加してもOK
- AudioSourceの「Audio Resource」へBGM用のAudioClipを割り当てる。バージョンによって「AudioClip」と表示される
- まずはSpatial Blendを0(2D)にし、Volumeを0より大きくする
- 自動再生を試す場合はPlay On Awakeをオン、繰り返すBGMならLoopもオンにする
- Main CameraなどのAudioListenerを確認し、Playモードで音が鳴るか確認する
BGMとSEは、最初は別々のGameObject・AudioSourceに分けると管理しやすいです。後述のスクリプトで再生タイミングを決める場合は、Play On Awakeをオフにしておきましょう。
公式の手順はAudioSourceの作成・音声の割り当てでも確認できます。
AudioSourceの構成要素(ミュート、ループ、音量・音程)

よく使う項目から確認していきましょう。上の画像は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から音が出ないときの確認点
スクリプトを大きく変える前に、以下を順に確認してみてください。
- 音声の割り当て:Playで鳴らすBGMはAudioSourceのAudio Resource、上のSE例はSEExampleのJump SEに設定したか
- 再生の呼び出し:Play On Awakeがオフなら、PlayやPlaySEを実際に呼んでいるか。サンプルを貼るだけでは自動再生しない
- 音量とミュート:AudioSourceのVolume・Mute、GameビューのMute Audio、OSや出力機器の音量を確認する
- AudioListener:有効なListenerが1つあるか。カメラを追加したあとに重複・無効化していないか
- GameObjectとコンポーネント:対象が有効か。Consoleにコンパイルエラーや参照エラーが出ていないか
- AudioMixer:Output先のグループやMasterがミュート、極端に小さい音量になっていないか
- 3Dサウンド:音源とListenerの距離、Spatial Blend、Volume Rolloffを確認する。切り分けとして一度2Dにして比べる
- 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の記事も活用しましょう。

サイトアイコン-2-150x150.png)