/// 現在再生中の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;
}
}