AudioSourceとは?

AudioSourceは、AudioClipを再生するためのコンポーネントです。

GameObjectにアタッチして使用し、BGMや効果音、ボイスなどゲーム中のあらゆるサウンド再生で利用されます。

AudioSourceは単体では動作せず、シーン内にAudioListener(音を「聞く」側)が存在することで初めて音が鳴ります。

AudioListenerはデフォルトでMainCameraにアタッチされているので、特に意識しなくても再生はできるようになっています。

音の流れをざっくり整理すると、以下のようになります。

  • AudioClip … 再生する音データ(.wav, .mp3, .oggなど)
  • AudioSource … AudioClipを再生する「スピーカー」
  • AudioListener … 音を受け取る「耳」(通常はカメラに付与)

この3つの関係性を押さえておくと、後の3Dサウンドの話も理解しやすくなります。

使用するバージョン

本記事の動作確認にはUnity 6 (6000.0 LTS)を使用しています。

AudioSource自体はUnityの初期バージョンから存在する機能なので、Unity 2022.3 LTS以前の環境でも基本的な使い方はそのまま通用します。

AudioSourceの基本的な使い方

GameObjectへのアタッチ

AudioSourceは他のコンポーネントと同様に、InspectorのAdd Componentボタンから追加できます。

空のGameObjectを作成し、AudioカテゴリからAudio Sourceを選択しましょう。

また、Hierarchyの右クリックメニューからAudio→Audio Sourceを選んでもOKです。

Inspectorの主要項目

AudioSourceには多くの設定項目がありますが、まずは以下を押さえておけば十分です。

項目説明
AudioClip / Audio Generator再生する音のデータ。プロジェクト内のオーディオファイルを指定する
Output出力先のAudioMixerグループ。未指定の場合はそのまま出力される
Play On Awakeチェックを入れるとGameObjectの有効化と同時に自動再生される
Loopチェックを入れると再生終了後に自動的に先頭から再生される
Volume音量(0.0〜1.0)。1.0が原音、0.0で無音
Pitch再生速度・音程(-3.0〜3.0)。1.0が原音、2.0で2倍速、0.5で半分の速度になる
Spatial Blend2D(平面的)と3D(立体的)のブレンド比率。0.0で完全2D、1.0で完全3D

BGMのように常に同じ音量で流したい音はSpatial Blendを0(2D)に、足音や効果音など位置感のある音は1(3D)に設定するのが基本です。

スクリプトから再生する

Play On Awakeを使えばスクリプトを書かなくても再生できますが、ゲームの進行に合わせて鳴らしたい場合はスクリプトから操作します。

基本となるメソッドは以下の4つです。

using UnityEngine;

public class AudioSourceSample : MonoBehaviour
{
    [SerializeField] private AudioSource _audioSource;

    // 再生
    public void PlaySound()
    {
        _audioSource.Play();
    }

    // 停止(先頭に戻る)
    public void StopSound()
    {
        _audioSource.Stop();
    }

    // 一時停止
    public void PauseSound()
    {
        _audioSource.Pause();
    }

    // 一時停止からの再開
    public void ResumeSound()
    {
        _audioSource.UnPause();
    }
}

StopとPauseの違いに注意してください。

Stopは再生位置を先頭にリセットしますが、Pauseは現在の位置を保持したまま止まります。

BGMのフェードアウト中や、ポーズ画面で一時的に止めたい場面ではPause/UnPauseの組み合わせが便利です。

Play と PlayOneShot の使い分け

効果音を扱う際によく出てくるのがPlayOneShotです。

Playとの違いを理解しておくと、攻撃音や決定音など短いSEを扱うときに役立ちます。

Play

PlayはAudioSourceに設定されたAudioClipを再生します。

同じAudioSourceに対して連続でPlayを呼ぶと、再生中の音は止まり、最初から再生し直されます。

_audioSource.clip = _seClip;
_audioSource.Play();

BGMのように「1つの音を1つのAudioSourceで鳴らし続ける」ケースに向いています。

PlayOneShot

PlayOneShotは、引数で渡したAudioClipを重ねて再生できるメソッドです。

連続で呼び出しても再生中の音は止まらず、複数の音が同時に鳴ります。

[SerializeField] private AudioSource _seSource;
[SerializeField] private AudioClip _attackClip;

private void OnAttack()
{
    // 連打しても音が途切れず重なって鳴る
    _seSource.PlayOneShot(_attackClip);
}

攻撃音、足音、UIの効果音など、短く何度も鳴る音に向いています。

第2引数で音量倍率も指定できます。

// 半分の音量で再生
_seSource.PlayOneShot(_attackClip, 0.5f);

使い分けのまとめ

用途おすすめ
BGM、ループする環境音Play(Loopにチェック)
短いSE、UI音、効果音PlayOneShot
キャラクターのボイス(途中で割り込みたい)Play(再生中なら止まる)

3Dサウンドの設定

AudioSourceは2Dサウンド(位置に関係なく一定の音量で鳴る)と3Dサウンド(位置によって音量や定位が変わる)の両方に対応しています。

切り替えはSpatial Blendで行います。

Spatial Blend

Spatial Blendは0.0〜1.0の値で、2Dと3Dのブレンド比率を表します。

  • 0.0 … 完全な2Dサウンド(距離や向きに関係なく同じ音量で鳴る)
  • 1.0 … 完全な3Dサウンド(距離・向きによって音量と定位が変化する)
  • 中間値 … 2Dと3Dをミックスした聞こえ方になる

BGMやUI音は0.0、ゲーム世界内で鳴る音(敵の足音、爆発音など)は1.0にするのが一般的です。

距離による減衰

3Dサウンドに設定すると、AudioListenerとの距離に応じて自動的に音量が減衰します。

3D Sound Settingsセクションを開くと、減衰に関する設定があります。

項目説明
Min Distanceこの距離より近い場所では最大音量で鳴る
Max Distanceこの距離より遠い場所では音量が一定(または無音)になる
Volume Rolloff距離による減衰のカーブ。Logarithmic/Linear/Customから選択

Logarithmic Rolloffは現実の音の減衰に近い挙動で、近距離での変化が大きく、遠距離では緩やかに減衰します。

Linear RolloffはMin DistanceからMax Distanceの間で線形に減衰し、コントロールしやすいので、ゲーム的な調整がしやすい設定です。

立体音響の実装例

試しに、敵キャラクターから足音が鳴る仕組みを作ってみます。

using UnityEngine;

public class EnemyFootstep : MonoBehaviour
{
    [SerializeField] private AudioSource _audioSource;
    [SerializeField] private AudioClip _footstepClip;
    [SerializeField] private float _interval = 0.5f;

    private float _timer;

    private void Start()
    {
        // 3Dサウンドとして鳴らす
        _audioSource.spatialBlend = 1.0f;
        _audioSource.rolloffMode = AudioRolloffMode.Logarithmic;
        _audioSource.minDistance = 1.0f;
        _audioSource.maxDistance = 15.0f;
    }

    private void Update()
    {
        _timer += Time.deltaTime;

        // 一定間隔で足音を鳴らす
        if (_timer >= _interval)
        {
            _timer = 0f;
            _audioSource.PlayOneShot(_footstepClip);
        }
    }
}

このEnemyオブジェクトをAudioListener(カメラ)の周囲で動かすと、敵が近づくと足音が大きく、左右どちらにいるかも分かるようになります。

ステルスゲームやホラー系のゲームでは、この仕組みが緊張感を生む決め手になります。

複数のAudioSourceを使い分ける

ゲームを作っていくと、BGM・SE・UI音・ボイスなど、複数のサウンドを同時に扱う場面が増えます。

これを1つのAudioSourceで済ませようとすると破綻するため、用途ごとにAudioSourceを分けるのが定石です。

よくある構成例

例えば、シーンに以下のようなGameObjectを用意します。

SoundManager
├── BgmSource     (AudioSource: Loop=true, Spatial Blend=0)
├── SeSource      (AudioSource: Loop=false, Spatial Blend=0)
└── UiSource      (AudioSource: Loop=false, Spatial Blend=0)

敵キャラの足音のように位置が重要な音は、敵GameObjectに個別のAudioSourceを持たせます。

スクリプトからの利用例

using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public static SoundManager Instance { get; private set; }

    [SerializeField] private AudioSource _bgmSource;
    [SerializeField] private AudioSource _seSource;
    [SerializeField] private AudioSource _uiSource;

    private void Awake()
    {
        Instance = this;
    }

    // BGMを再生
    public void PlayBgm(AudioClip clip)
    {
        _bgmSource.clip = clip;
        _bgmSource.Play();
    }

    // 効果音を重ねて再生
    public void PlaySe(AudioClip clip)
    {
        _seSource.PlayOneShot(clip);
    }

    // UI音を再生
    public void PlayUi(AudioClip clip)
    {
        _uiSource.PlayOneShot(clip);
    }
}

なお、シーンをまたいで使い続ける場合はDontDestroyOnLoadと二重生成防止の処理が別途必要です。

呼び出し側はシンプルになります。

// 攻撃時のSEを鳴らす
SoundManager.Instance.PlaySe(_attackClip);

こうしておくと、後から「BGMだけ音量を半分にしたい」「UI音だけミュートしたい」といった調整も、対象のAudioSourceのvolumeを変えるだけで済みます。

AudioMixerでさらに本格的に

用途別にAudioSourceを分けたら、次のステップとしてAudioMixerを導入するのがおすすめです。

AudioMixerは複数のAudioSourceの出力をグループ化し、音量・エフェクト・ダッキングなどを一元管理できる仕組みです。

オプション画面で「BGM音量」「SE音量」を個別にスライダーで調整するような機能も、AudioMixerを使えばスマートに実装できます。

具体的な手順はAudioMixerでサウンドオプションを実装する記事にまとめているので、AudioSourceの基本がつかめたら覗いてみてください。

気をつける点

PlayOneShotとLoopは併用できない

PlayOneShotで鳴らした音は、AudioSourceのLoop設定の影響を受けません。

「ループする効果音をPlayOneShotで鳴らそうとしたけど1回しか鳴らない」というのはよくあるハマりどころです。

ループさせたい音は、clipをセットしてPlayで再生しましょう。

// NG: PlayOneShotではLoopにならない
_audioSource.loop = true;
_audioSource.PlayOneShot(_loopClip);

// OK: PlayならLoop設定が効く
_audioSource.clip = _loopClip;
_audioSource.loop = true;
_audioSource.Play();

PlayOneShotで鳴らした音は途中で止めにくい

Stopメソッドは、Playで再生中のclipは止めますが、PlayOneShotで重ね再生した音は止まりません。これは結構ハマりやすいポイントです。

途中で止めたい音がある場合は、専用のAudioSourceを用意してPlayで再生するようにしておくと安心です。

isPlayingで再生中かを判定する

現在再生中かどうかはisPlayingプロパティで取得できます。

if (!_audioSource.isPlaying)
{
    _audioSource.Play();
}

ただしPlayOneShotで鳴らした音はisPlayingに反映されないことがあるので、PlayOneShotの判定用途では使わないようにしましょう。

同時再生数の上限

UnityのAudioSourceは、プラットフォームやハードウェアによって同時再生できる音の数に上限があります。

大量の効果音を一度に鳴らすとプチプチ途切れることがあるので、優先度(Priority)を設定したり、不要な音は止めるなどの工夫をしておくと安心です。

まとめ

今回はAudioSourceの入門として、基本的な再生方法から3Dサウンド、複数AudioSourceを組み合わせた構成までを紹介しました。

押さえておきたいポイントは以下のとおりです。

  • AudioSourceはAudioClipを再生するコンポーネントで、AudioListenerとセットで動く
  • PlayはBGMやループ音向け、PlayOneShotは短いSE向け
  • 3Dサウンドにしたい場合はSpatial Blendを1.0にし、Min/Max DistanceとVolume Rolloffを調整
  • BGM・SE・UI音は用途ごとにAudioSourceを分けると管理が楽になる
  • さらに踏み込んで音量調整やエフェクト管理をしたいならAudioMixerへ

まずはPlay On AwakeとLoopを使った簡単な再生から試して、慣れてきたらスクリプト制御や3Dサウンドへ広げていくのがおすすめです。

音を入れるだけでゲームの完成度はぐっと上がるので、AudioSourceをうまく活用してみてください。