SE再生マネージャーの導入【Unity6】

絶対調味ロジック

音量設定の実装完了時にAiに薦められていた「SE(効果音)の管理運用システム」を実装してみます。
音源実装が遅かったため「SE」の設置・再生について特に考えていなかったので、ちょうど良い提案でした。

SE再生マネージャーの設計案

前提となる現在のオーディオ環境

AudioMixer構造
SoundMixer内にSEグループが既に存在し、設定画面の「SEスライダー」と連動している。

物理的な約束事
今後作成する「SE再生用AudioSource」の「Output」に、必ずこの「SEグループ」を割り当てる必要がある。

実装の目的

簡略化
シーン上の各オブジェクトに「AudioSource」を手動で追加する手間をなくす。

ワンライン呼び出し
Sys_AudioManager.Instance.PlaySE(“SoundName”) のように、スクリプト1行でどこからでも音を鳴らせるようにする。

実装に必要な3つの要素

要素内容
AudioSourceのプール同時に複数のSE(爆発音と足音など)を鳴らすため、
1つではなく複数のAudioSourceを管理する仕組み。
音素材(AudioClip)の管理インスペクターでリスト化するか、
Resourcesフォルダ等から名前で呼び出せるようにする設計。
再生メソッドPlaySE(AudioClip clip) や PlaySE(string name) といった、
外部から叩くためのインターフェース。

注意点・引き継ぎ事項

プレビュー音源との共存
設定画面(UI_AudioSettingsPanel)が持っているプレビュー用Sourceとは別に、ゲーム本編用のSource群を用意する。

負荷対策
「超ローPC」対応として、
SEを鳴らしすぎた場合に古い音から消す、あるいは最大同時再生数を制限するロジックを検討する。

堅牢な音響システム

音量設定システム時にも起きた不具合である「ロード後に鳴らなくなる(AudioSourceがミッシングする)問題」の
解決のための構築。

  • 司令塔 (Sys_AudioManager):DontDestroyOnLoadで守られた唯一の再生機。
  • データ (SEDataBase / AudioClip):鳴らしたい音そのもの。
  • 窓口 (AudioTrigger):各シーンのボタンや演出に貼り付ける小さなスクリプト。
状況従来の方式(ドラッグ&ドロップ)今回の設計案(AudioTrigger)
ロード直後ボタンが「消えた旧Manager」を指したまま
Missing
Instance経由で「現役のManager」を探す
成功
演出の複製参照が外れたり、別のSourceを探す手間があるAudioTriggerごとコピペするだけで完了
効率的
共通SE変更全シーンのSourceを回って音量調整が必要Sys_Audio_Manager 一箇所を直せば全SEが変わる
保守性◎

SE再生マネージャーの実装

データアセットの作成

音の入れ物」を作ります。
音源と対応したキーをリスト化していくことで、音の呼び出しを簡略化します。

SEDataBase と SEKey

SEDataBase」は、音源(Clip)に「名前(Key)」をつけて管理するための住所録のようなものです。
SEKey」とは、SEDataBaseに登録した「名前」のことです(例:Test, Cursor_Move, Explosion)。

ここは最初分かりずらかったポイントです。
イメージとしてはCDアルバムみたいな感じで、
何番(SEKey)を指定すれば、そこに登録されている音源が鳴るデータベース(リスト)です。
ゲーム内で使用する効果音をどんどん追加してリスト化していく運用となります。

管理の集約
100箇所で「決定音」を鳴らしている場合、後で音を変えたくなっても、
データベースの「Clip」を差し替えるだけで全箇所が更新されます。

コードの可読性
スクリプトから PlaySE(“Test”) と書くだけで音が鳴るため、
いちいちAudioClipの変数を用意してインスペクターでアサインする手間が省けます

専用スクリプトを保存すると、新規作成の「Audio」から、そのデータベースを作成することができるようになります。

[CreateAssetMenu(fileName = "SEDataBase", menuName = "Audio/SEDataBase")]
public class SEDataBase : ScriptableObject
{
    [System.Serializable]
    public class SEEntity
    {
        public string key;           // 呼び出す時の名前(例:"Jump")
        public AudioClip clip;       // 実際の音源ファイル
        [Range(0, 1)] public float volumeScale = 1f; // 音ごとの微調整
    }

    public List<SEEntity> seList = new List<SEEntity>();

    public SEEntity GetEntity(string key)
    {
        return seList.Find(x => x.key == key);
    }
}

AudioManagerの配置

新規スクリプト「Sys_Audio_Manager.cs」を作成し、「AudioManager」にアタッチします。
参照する「データベース」「ミキサー」「ミキサーグループ」をそれぞれアサインします。

Sys_AudioManager.Instance.PlaySE() で再生できるようになります。

同時再生数:現在は10音(maxPoolSize)まで同時に鳴ります。
激しい演出で音が途切れる場合は、この数値を増やします。

AudioTriggerの作成

Sys_AudioTrigger.cs」をボタンや任意のオブジェクトにアタッチし、
音素材(またはリストキー)を設定することにより、SEを鳴らすことができます。

ボタンの場合はオンクリックで再生します。

演出のためのSEは「Play On Enable」で自動再生させます。

運用パターン

パターン①:特定のタイミングで「出現」させて鳴らす

  1. 空のゲームオブジェクト(名前を SE_Explosion などにする)を作る。
  2. Sys_AudioTrigger を貼り、音を指定する。
  3. Play On Enable にチェックを入れる。
  4. そのオブジェクトを一旦 非アクティブ(灰色) にしておく。
  5. 演出スクリプトやタイムラインから、このオブジェクトを SetActive(true) にする。

👉 結果:表示された瞬間に音がドカンと鳴ります。

パターン②:既存の演出物に「相乗り」させる

  1. 例えば「爆発エフェクト(Particle System)」のオブジェクトに、この Sys_AudioTrigger を貼る。
  2. Play On Enable を ON にする。

👉 結果:爆発エフェクトが出た瞬間に、音も自動的に同期して鳴ります。

SEDataBase のリストはどう扱うべきか?

Sys_AudioTriggerに「SE Key」と「Direct Clip」の両方の設定があることについて

鳴らし方向いている音メリット
SE Key(DB経由)システム音、UI音、足音など頻繁に使う音後から一括で音を差し替えられる。
Direct Clip(直接アサイン)そのシーンでしか使わない特殊な音インスペクターだけで完結する。

SE基盤

Sys_Audio_Manager

  • シングルトン + オブジェクトプール方式。
  • ロードを跨いでも Instance が常に最新を指すため、Missing知らず。
  • PlaySE(string key) と PlaySE(AudioClip clip) の両対応で、汎用性と自由度を両立。

Sys_AudioTrigger

  • Play On Enable により、「置くだけ、出すだけ」 で音が鳴る演出ワークフローを確立。
  • UIボタンからも自分自身を呼ぶだけで済むため、シーン遷移に強い。

Sys_Messenger

  • ボイスとポポポ音を Sys_AudioSettingsManager に一任。
  • シーンごとの AudioSource 依存を排除し、「Clipを投げるだけ」 のクリーンな構造へ。

コメント