UnityでAudioSourceをBGM用とSE用に分ける理由

ゲームを制作していると、BGMやボタンを押した音、攻撃音など、さまざまな音を再生する機会があります。

UnityではAudioSourceコンポーネントを使用して音を再生しますが、初心者の方は

「AudioSourceは1つだけでいいのでは?」

と思うかもしれません。

私も最初は同じ疑問を持っていました。

しかし実際にゲームを作り始めると、BGM用とSE用でAudioSourceを分けるメリットがたくさんあります。

この記事では、その理由を解説します。

AudioSourceとは?

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

例えば、

  • BGM
  • ボタンを押した音
  • 攻撃音
  • ダメージ音

など、ゲーム内のさまざまな音を再生できます。

AudioSourceを1つだけで運用するとどうなる?

例えばAudioSourceが1つだけだったとします。

AudioManager
└── AudioSource

この状態でもゲームは動きます。

例えばBGMを再生する場合は、

audioSource.clip = battleBGM;
audioSource.Play();

SEを再生する場合は、

audioSource.PlayOneShot(buttonSE);

と書くことができます。

一見問題なさそうですが、ゲームの規模が大きくなると少しずつ管理が難しくなります

BGMとSEでは役割が違う

まず理解したいのが、BGMとSEは用途が異なるということです。

BGM

BGMは

  • タイトル画面
  • バトル
  • リザルト

など、シーンごとに基本的に1曲だけ流れます。

ループ再生することも多く、ゲーム全体の雰囲気を作る役割があります。

SE

SEは

  • ボタンを押す
  • 攻撃する
  • ダメージを受ける
  • レベルアップする

など、イベントが発生するたびに再生されます。

しかも短時間に何度も鳴る可能性があります。

AudioSourceを2つに分ける

そこでおすすめなのがこちらです。

AudioManager
├── AudioSource(BGM)
└── AudioSource(SE)

メリット① BGMだけ止められる

例えばゲームオーバーになった瞬間だけBGMを止めたい場合があります。

BGM専用AudioSourceなら

bgmSource.Stop();

だけで済みます。

SEには影響しません。

メリット② BGMとSEの音量を別々に調整できる

ゲームでは

  • BGMを小さく
  • SEを大きく

したいことがあります。

AudioSourceを分けておけば

bgmSource.volume = 0.3f;
seSource.volume = 1.0f;

のように簡単に調整できます。

メリット③ SEを連続で再生できる

SEは

  • 攻撃
  • ダメージ
  • ボタン

などが同時に鳴ることがあります。

そのため

seSource.PlayOneShot(attackSE);

を使うことで、再生中でも別のSEを重ねて鳴らすことができます。

メリット④ AudioMixerを使いやすい

UnityにはAudioMixerという便利な機能があります。

AudioMixerを使うと

  • BGMだけミュート
  • SEだけミュート
  • オプション画面で音量調整

などが簡単になります。

AudioSourceを最初から分けておくことで、後からAudioMixerを導入しやすくなります。

Inspectorでの設定

AudioManagerにAudioSourceを2つ追加します。

BGM

  • Loop:ON
  • Play On Awake:OFF

SE

  • Loop:OFF
  • Play On Awake:OFF

あとはスクリプトからそれぞれ参照します。

[SerializeField] private AudioSource bgmSource;
[SerializeField] private AudioSource seSource;

AudioManagerの例

using UnityEngine;

public class AudioManager : MonoBehaviour
{
[SerializeField] private AudioSource bgmSource;
[SerializeField] private AudioSource seSource;

public void PlayBGM(AudioClip clip)
{
    bgmSource.clip = clip;
    bgmSource.Play();
}

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

public void StopBGM()
{
    bgmSource.Stop();
}

}

このように役割ごとにメソッドを分けておくと、他のスクリプトからも呼び出しやすくなります。

まとめ

ゲーム制作では、AudioSourceをBGM用とSE用に分けるのが一般的です。

分けることで、

  • BGMだけ停止できる
  • 音量を別々に設定できる
  • SEを重ねて再生しやすい
  • AudioMixerへ発展しやすい
  • スクリプトの管理がしやすくなる

といったメリットがあります。

ゲーム制作を始めたばかりの頃は「AudioSourceは1つで十分では?」と思うかもしれませんが、開発が進むほど役割を分けておく恩恵を実感できます。

コメント