【Unity入門⑫】2Dアクションゲームで開始時にBGMを流そう!

Unity2D入門シリーズ

こんにちは!夜の街2Dアクションゲームを制作中の怪獣です🦖

今回はゲームを起動した瞬間に、 BGMを自動再生する方法を解説します。
BGMが入るだけで、画面の印象やゲームの世界観が一気に引き締まり、ゲームらしさがグッと増します!

BGMはゲーム全体で共通の要素なので、
今回は MainManagerで一括管理し、UnityのInspectorから設定できる形にします。


この記事ですること

  • ゲーム開始時にBGMが自動で再生される
  • BGMは MainManager が管理する
  • BGMの設定は コードを書き換えず Inspector から変更できる

① BGM用Prefabを作成する

BGMオブジェクトを作成

Prefab化するように、まずはBGMオブジェクトを作成していきます。

Hierarchy → Create Empty → 名前を BGMに変更する

  • AudioSource を追加し、以下を設定します。

AudioSourceは以下を設定します。

項目設定
AudioClip(再生する音声ファイルを指定)使用したいBGMをドラッグする
Play On Awake(オブジェクトが生成された瞬間に自動再生するか)✅ ON
Loop(音を繰り返し再生するか)✅ ON
Volume(音量)0.2〜0.5(好み)

Prefab化する

Hierarchy の BGM を Project ウィンドウへドラッグして Prefab にします。
Prefab化したら、シーン上の BGM オブジェクトは削除してOKです。


② MainManagerに処理を書く

MainManager.csに以下の処理を書いていきます。(コピペOK!)

using UnityEngine;

public class MainManager : MonoBehaviour
{
    [SerializeField, Header("BGM設定")] private GameObject _bgmPrefab; // ← BGM を割り当て
    private static GameObject _bgmInstance;

    private void Awake()
    {
        // BGM開始
        _PlayBGM();
    }

    private void _PlayBGM()
    {
        // すでにBGMが生成されている場合は何もしない
        if (_bgmInstance != null) return;

        // BGMを生成(Prefab側の Play On Awake で再生される)こ
        _bgmInstance = Instantiate(_bgmPrefab);

        // シーンをまたいでもBGMを維持したい場合
        DontDestroyOnLoad(_bgmInstance);
    }
}

③各処理の説明(初心者向け)

BGMの設定、制御について

[SerializeField, Header("BGM設定")]
private GameObject _bgmPrefab;
  • Unity上のInspectorに表示するための属性
  • Unity上の設定で、①でPrefabしたBGMをドラッグします

Inspectorでは次のように表示されます⬇️

MainManager
 └ BGM設定
     └ Bgm Prefab

private static GameObject _bgmInstance;

この変数は、今、BGMがすでに存在しているか?を覚えておくためのものです。
後に説明していますが、この情報を持たせておくことでBGMの二重再生防止ができます。
また、staticにすることで以下の設定をすることができます。

  • 新しい MainManager が作られても参照できるようになる
  • シーンが変わっても値が保持される(シーンをまたいでもBGMを維持したい場合)

_PlayBGM()

if (_bgmInstance != null) return;

すでにBGMが存在していたら、何もしないということをしています。

  • BGMが鳴っている状態で
  • もう一度生成するのを防ぐ

これで二重再生を防止するようにしています。


_bgmInstance = Instantiate(_bgmPrefab);

BGMのPrefabを生成して、変数に保存しています。

  • Prefabを実体化
  • 生成されたオブジェクトを _bgmInstance に代入

これで、「今鳴っているBGMはこれだ」と MainManager が把握できるようになります。


DontDestroyOnLoad(_bgmInstance);

シーンが切り替わっても、このBGMを消さない、ということをしています。

  • リトライ
  • ステージ切り替え
  • タイトル → ゲーム

でも 同じBGMを鳴らし続けたい場合 に使います。

※ シーンごとにBGMを変えたい場合は、この行を削除 or 制御を変えます。


④ Unity上でBGMを設定する方法

  1. Hierarchyで MainManager を選択する
  2. Inspectorの「BGM設定」欄を確認
  3. Bgm Prefab
    作成した BGM.prefabドラッグ&ドロップします

これで設定完了です✨
コードを触らずにBGMを差し替え可能になります。

動作確認

➡️BGMを入れることで一気にゲームの世界観が出ますね!


トラブルシューティング

上手くいかない場合は以下を見直してみてください。

BGMが鳴らない

  • Inspectorで _bgmPrefab が未設定になっている
  • AudioSource の Play On Awake が OFFのまま
  • AudioClip が未設定になっている

BGMが二重で鳴る

  • static GameObject _bgmInstance が無い
  • DontDestroyOnLoad を使っているのに
    別シーンにも MainManager が存在している

まとめ

  • BGMは MainManager で管理するのがわかりやすい
  • SerializeField + Header を使うと Inspector から設定できる
  • Prefab化 + Instantiate で柔軟なBGM再生が可能
  • static管理で二重再生を防ぐ

この記事ではゲーム開始時にBGMを自動再生させる方法を解説しました。
最後まで読んでいただきありがとうございました。

この記事が少しでもゲーム制作に役立てたら嬉しいです🦖

次回の記事では、「プレイヤーがマップから落下したら、ゲームオーバーUIを表示する」実装方法を解説していきます!

コメント

タイトルとURLをコピーしました