スピーカ管理クラス作ってみた
こんにちは。
初めての記事なので拙いですが大目に見てください。
今回は、音の出力を管理するクラスを作成しました。
どのゲームを作っていても必ず必要になるのが音です。
音の出力・停止・上書き・音量調整など考えることが多くてめんどくさいので、
クラスで管理するとそれなりに簡単にできるようになりました。
クラス内容【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画面で、音データ配列にデータを設定する
③.シーン起動時にサウンド管理クラスを初期化し、
音データの配列、スピーカーオブジェクトを設定する
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); }
使い方【メソッド解説】
- 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%偏った考えになるので、
このブログでどんどんコードを載せて
どんどんダメ出しいただけるようになるのが今の目標です