まとめて停止、再生
FindObjectOfType
を利用して、
シーン上にある全てのAudioSourceコンポーネント
をStart
で集めてくる方法を使います。
なので、途中で生成されたAudioSourceコンポーネント
は範囲外です。
外部から呼び出すことは確定しており、2つ以上必要なコンポーネントではないので
シングルトンを用います。
シングルトン
あんまり理解せずに使ってましたが、
この説明1が個人的には一番しっくりきました。
Unityでゲーム作ってるとどこからでも呼び出したいクラスが欲しくなります。
命名するとなんちゃらマネージャーみたいになるやつ。
AudioManagerとか、SettingManagerとか、ParticleManagerとか
どこからでも呼び出せると便利で、でも2つ以上あったら変なもの。
じゃーどうすんの?って調べてると大体シングルトンっていう考え方に行き着くと思う。
ようするにインスタンスを1個しか作らなければいいだけ。
あとシングルトンというのはデザインパターンのことらしいです。
C#の機能か何かだと思ってた。
シングルトン実装
最強に使いやすい1のがあるのでいつも使わせてもらってます。
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour {
static T instance;
public static T Instance
{
get
{
if(instance == null)
{
instance = (T)FindObjectOfType(typeof(T));
if(instance == null)
{
Debug.LogError( typeof(T) + " none");
}
}
return instance;
}
}
}
using UnityEngine;
public class SoundsOnOffController : Singleton<SoundsOnOffController>
{
AudioSource[] audioSources;
AudioSource[] tmpAudioSources;
int count;
void Start()
{
audioSources = FindObjectsOfType(typeof(AudioSource)) as AudioSource[];
tmpAudioSources = new AudioSource[audioSources.Length + 1];
}
public void StopSounds()
{
foreach (AudioSource _as in audioSources)
{
if (_as.isPlaying == true)
{
tmpAudioSources[count] = _as;
_as.Pause();
count++;
}
}
}
public void StartSounds()
{
for (int i = 0; i < tmpAudioSources.Length; i++)
{
if (tmpAudioSources[i] != null)
{
tmpAudioSources[i].UnPause();
tmpAudioSources[i] = null;
}
}
}
}
Pause、UnPause
今回はPause
とUnPause
を使っています。
Pause
でAudioを止めて、UnPause
で止めた箇所から再生です。
大量にAudioがあるときの負荷なんかは調べてないので知りませんが5、6個なら問題なく動きました。
呼び出し方
SoundsOnOffController.Instance.StartSounds();
このようにしてあげればどこからでもスクリプト経由で呼び出せます。