のにっき

スピーカ管理クラス作ってみた

こんにちは。
初めての記事なので拙いですが大目に見てください。

今回は、音の出力を管理するクラスを作成しました。
どのゲームを作っていても必ず必要になるのが音です。

音の出力・停止・上書き・音量調整など考えることが多くてめんどくさいので、
クラスで管理するとそれなりに簡単にできるようになりました。

クラス内容【C#

    /********************************************************************
        クラス名    : SoundIf
        概要        : サウンド管理
    ********************************************************************/
    public class SoundIf
    {
        //=======================================
        // 変数定義
        //=======================================
        int i_Ch = 0;
        // サウンド格納
        public AudioClip[] Sd_Se;
        public AudioClip[] Sd_Bgm;
        public AudioClip[] Sd_Voice;
        // スピーカー管理
        public AudioSource Audio_Voise;
        public AudioSource Audio_Bgm;
        public AudioSource[] Audio_Se;

        /********************************************************************
           コントラクタ   : SoundIf
        ********************************************************************/
        public SoundIf(AudioClip[] Snd_Se, AudioClip[] Snd_Bgm, AudioClip[] Snd_Voice)
        {
            //=======================================
            // 変数初期化
            //=======================================
            i_Ch = 0;
            Sd_Se = Snd_Se;
            Sd_Bgm = Snd_Bgm;
            Sd_Voice = Snd_Voice;
        }

        /*******************************************************************
           メソッド       : SetSpeaker
           概要           : スピーカー作成処理
        *******************************************************************/
        public void SetSpeaker(GameObject Obj_Canvas)
        {
            //======================================
            // スピーカー作成
            //======================================
            Audio_Voise = new AudioSource();
            Audio_Bgm = new AudioSource();
            Audio_Se = new AudioSource[2];
            Audio_Voise = Obj_Canvas.AddComponent<AudioSource>();
            Audio_Bgm = Obj_Canvas.AddComponent<AudioSource>();
            Audio_Se[0] = Obj_Canvas.AddComponent<AudioSource>();
            Audio_Se[1] = Obj_Canvas.AddComponent<AudioSource>();

            //======================================
            // スピーカー初期設定
            //======================================
            SetVolume(0);
        }

        /******************************************************************
           メソッド       : DestroySpeaker
           概要           : スピーカー削除処理
        ******************************************************************/
        public void DestroySpeaker()
        {
            //======================================
            // スピーカー削除
            //======================================
            Destroy(Audio_Voise);
            Destroy(Audio_Bgm);
            Destroy(Audio_Se[0]);
            Destroy(Audio_Se[1]);
        }

        /******************************************************************
           メソッド       : SetVolume
           概要           : スピーカー音量設定処理
        ******************************************************************/
        public void SetVolume(int i_Mode)
        {
            //======================================
            // 変数定義 ※設定する音量をモードとして管理している
            //======================================
            float[,] f_SetVol = new float[2, 4]
                {//     BGM,    VOICE,  SE1,    SE2
                    {   0.25f,  1f,     0.5f,   0.5f},  // 00:【例】タイトル画面
                    {   0.5f,   1f,     0.2f,   0.2f},  // 01:【例】プレイ画面
                };

            //======================================
            // ボリューム設定
            //======================================
            Audio_Bgm.volume = f_SetVol[i_Mode, 0];
            Audio_Voise.volume = f_SetVol[i_Mode, 1];
            Audio_Se[0].volume = f_SetVol[i_Mode, 2];
            Audio_Se[1].volume = f_SetVol[i_Mode, 3];

        }

        /******************************************************************
           メソッド       : OutSnd系
           概要           : サウンド出力処理
        *******************************************************************/
        /******************************************************************
           : BGM
        ******************************************************************/
        public void OutSnd_Bgm(int i_Param)
        {
            Audio_Bgm.Stop();
            Audio_Bgm.loop = true;
            Audio_Bgm.clip = Sd_Bgm[i_Param];
            Audio_Bgm.Play();
        }
        /*****************************************************************
           : SE ※isCover=前の音を消すかどうか
        ******************************************************************/
        public void OutSnd_Se(int i_Param, bool isCover)
        {
            //----------------------------------------------------------------
            // チャンネル被らせ処理
            //----------------------------------------------------------------
            if (isCover == true)
            {
                Audio_Se[0].Stop();
                Audio_Se[1].Stop();
            }
            //----------------------------------------------------------------
            // 出力チャンネル更新
            //----------------------------------------------------------------
            if (i_Ch == 0)
            {
                i_Ch = 1;
            }
            else
            {
                i_Ch = 0;
            }
            //----------------------------------------------------------------
            // 出力処理
            //----------------------------------------------------------------
            Audio_Se[i_Ch].PlayOneShot(Sd_Se[i_Param]);
        }
        /*****************************************************************
           : Voice
        ******************************************************************/
        public void OutSnd_Voice(int i_Param)
        {
            Audio_Voise.Stop();
            Audio_Voise.PlayOneShot(Sd_Voice[i_Param]);
        }
    }

使い方【初期設定編】

①.適当なオブジェクト(今回は「ScriptMng」)に、
 使用する音データを配列化するためのスクリプト( Hige_MainCntrl )を設定する

Hige_MainCntrl の内容
    public AudioClip[] Snd_Se;            // Seで使用する音データを格納
    public AudioClip[] Snd_Bgm;        // Bgmで使用する音データを格納
    public AudioClip[] Snd_Voice;       // Voiceで使用する音データを格納

②.Inspector画面で、音データ配列にデータを設定する

f:id:apuridasuo:20190401111913p:plain
図:SoundIf仕様解説

③.シーン起動時にサウンド管理クラスを初期化し、
 音データの配列、スピーカーオブジェクトを設定する 

Hige_MainCntrl の内容
    void Start()
    {
        //==========================================
        // サウンド管理クラス初期化
        //==========================================
        // 音配列格納 ※今回は「Cmn」クラスにSoundIfクラスを定義している
        Cmn.cls_Sound = new Cmn.SoundIf(Snd_Se, Snd_Bgm, Snd_Voice);
        // サウンド管理スピーカー作成 
        // ※今回は「Canvas_Main」だが、シーン内のGameObjectなら何でもOK!
        Cmn.cls_Sound.SetSpeaker(Canvas_Main);
    }

↓このコードによって・・・

f:id:apuridasuo:20190401120330p:plain
図:Canvas_Main内のコンポーネント比較

使い方【メソッド解説】

  • SetSpeaker(GameObject Obj_Canvas)

上記③の説明の通り、指定したGameObject(Obj_Canvas)に
AudioSourceコンポーネントを作成する

  • DestroySpeaker()

作成したAudioSourceコンポーネントを削除する
シーン移動時等で使用できる

  • SetVolime(int i_Mode)

AudioSourceコンポーネントの音量を
「f_SetVol」の配列の指定番地(i_Mode)の音量に変更する

  • OutSnd_Bgm(int i_Param)

【初期設定編】②で作成した「Snd_Bgm」配列の
指定番地(i_Param)の音データを出力

  • OutSnd_Voice(int i_Param)

【初期設定編】②で作成した「Snd_Voice」配列の
指定番地(i_Param)の音データを出力

  • OutSnd_Se(int i_Param, bool isCover)

【初期設定編】②で作成した「Snd_Se」配列の
指定番地(i_Param)の音データを出力
「isCover=true」以前に出力した音を消す
「isCover=false」以前に出力した音を消さない


以上になります。
現状、Seを3つ以上鳴らすと前の音が消えてしまうので
「Audio_Se」配列を2つより多く持てば、
その分重ねて鳴らすことができるようになっています。

それなりに汎用性ができたかなと思いますが、
記事にしてみると修正点が見えてきました。。。

よろしければ使ってみたり、
ダメ出しをいただけると嬉しいです!

独学だと100%偏った考えになるので、
このブログでどんどんコードを載せて
どんどんダメ出しいただけるようになるのが今の目標です