LoginSignup
1
0

More than 3 years have passed since last update.

【Unity(C#)】Scene上のサウンドをまとめて再生、停止する方法

Last updated at Posted at 2019-08-14

まとめて停止、再生

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

今回はPauseUnPauseを使っています。
PauseでAudioを止めて、UnPauseで止めた箇所から再生です。

大量にAudioがあるときの負荷なんかは調べてないので知りませんが5、6個なら問題なく動きました。

呼び出し方

SoundsOnOffController.Instance.StartSounds();
このようにしてあげればどこからでもスクリプト経由で呼び出せます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0