SAVE・CONFIG画面のBGMについてご質問があります。

12 views
Skip to first unread message

須山勇紀

unread,
May 8, 2026, 7:32:09 PM (7 days ago) May 8
to 宴ユーザーグループ
ゲーム中に SAVE・CONFIG 画面を開いた際、  
その画面専用のBGMが再生されることは確認できたのですが、  
画面を閉じてゲームに戻った際に、元のゲーム中BGMへ復帰させたいと考えております。

この復帰処理について、どのように設定すればよいか  
ご教示いただけますと幸いです。

お手数をおかけしますが、よろしくお願いいたします。

マッドネスラボ

unread,
May 8, 2026, 9:45:43 PM (7 days ago) May 8
to 宴ユーザーグループ
基本設定ではできません。

サウンドマネージャーを操作する形で、BGMを記録し、あとから同じBGMを鳴らし直すプログラムを書く必要があります。
下記がサンプルになりますので、このようなコンポーネントを作成して
「Canvas-AdvUI/MainGame」にAddComponentしてみてください。

using UnityEngine;
using Utage;
using UtageExtensions;

    /// 現在再生中のBGMを記録し、あとから同じBGMを鳴らし直すためのサンプル
    public class Sample : MonoBehaviour
    {
        AdvEngine AdvEngine => this.GetAdvEngineCacheFindIfMissing(ref advEngine);
        [SerializeField] AdvEngine advEngine;

        UtageUguiMainGame MainGame => this.GetComponentCache(ref mainGame);
        [SerializeField] UtageUguiMainGame mainGame ;

        //AdvEngineや画面開閉イベントに自動リンクするか
        [SerializeField] bool autoLinkEvent = true;
       
        AudioClip storedClip;
        bool storedIsLoop;
        /// 記録済みの状態があるか
        public bool HasStoredState { get; private set; }

        void Awake()
        {
            if (autoLinkEvent)
            {
                AdvEngine.OnClear.AddListener((_)=>Clear());
                MainGame.onClose.AddListener(StoreCurrentBgm);
                MainGame.onOpen.AddListener(()=> RestoreBgm());
            }
        }

        /// 現在再生中のBGMを記録する
        public void StoreCurrentBgm()
        {
            var sm = SoundManager.GetInstance();
            if (sm == null)
            {
                Clear();
                return;
            }

            if (!IsPlayingBgm())
            {
                HasStoredState = true;
                storedClip = null;
                return;
            }

            var source = sm.System.GetAudioSource(SoundManager.IdBgm, SoundManager.IdBgm);
            storedClip = source.clip;
            storedIsLoop = source.loop;
            HasStoredState = true;
        }

        bool IsPlayingBgm()
        {
            var sm = SoundManager.GetInstance();
            if (!sm.IsPlayingBgm())
            {
                return false;
            }
           
            var source = sm.System.GetAudioSource(SoundManager.IdBgm, SoundManager.IdBgm);
            if (source == null || source.clip == null)
            {
                return false;
            }
            return true;
        }

        /// 記録しておいたBGMを鳴らし直す
        public void RestoreBgm(float fadeInTime = 0.2f)
        {
            if (!HasStoredState)
                return;

            var sm = SoundManager.GetInstance();
            if (sm == null)
                return;
           
            //記録しておいたBGMがない場合はBGMを止める
            if(storedClip == null)
            {
                sm.StopBgm(fadeInTime);
                return;
            }
           
            //記録しておいたBGMを鳴らす
            sm.PlayBgm(storedClip, storedIsLoop, fadeInTime);
        }


        /// 記録をクリアする
        public void Clear()
        {
            storedClip = null;
            HasStoredState = false;
        }
    }


autoLinkEventがtrueになっていると、 MainGame画面の開閉タイミングでBGMの記録と復帰を行うようにしています。
タイトル画面から開いたときやセーブデータのロード時には、画面を開いてもBGMの復帰をさせないようにする必要があるので、AdvEngineのOnClearで、記録済みフラグをオフにしています。
また、「BGMが鳴っていない状態に復帰する」ために、記録時にBGMが鳴っていなかったら、復帰時にBGMを止めています。

イベント呼び出しを使わずに自作のプログラムから呼び出すなどしたい場合は、autoLinkEventをオフにして、直接メソッドを呼び出すなどしてください。


2026年5月9日土曜日 8:32:09 UTC+9 suyam...@gmail.com:
Reply all
Reply to author
Forward
0 new messages