サウンドメモ

音の設定があまり完全な状態で落ちてないのでメモ。
といってる私も完全ではないので直せそうな場所は直していきましょうヽ(・ω・*)
とりあえず音が鳴るよっていうくらいのメモととらえてください。

#サウンドマン
いきなりどうでもいいことですが
ファイル名をsoundmanとしてます。
これはサウンドマンじゃなくてサウンドマネージャーの略なのですが
サウンドマンと呼んでます。（ほんとにどうでもいいね！）

#まずはスクリプトから

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //Toggleで必要
using UnityEngine.Audio; //Audio系で必要

public class soundman : MonoBehaviour {

	private AudioSource bgm_as; //bgmプレイヤーの場所
	private AudioSource se_as; //seプレイヤーの場所
	public static string bgm; //音楽を変更したい場合の名前を保存する場所
	public static string se;

	public AudioMixer mixer; //ミキサーの場所
	public Slider bgms; //bgmのスライダーの場所
	public Slider ses; //seのスライダーの場所
	public Toggle tog; //音オンオフのトグルの場所

	private List<msta> musics = new List<msta>(); //いろいろやった結果、Listに情報をまとめることにしました

	public AudioClip bgm_0; //音楽
	public AudioClip bgm_1; //bgmを増やす場合、bgm_2 bgm_3……と増やしていけばいい

	public AudioClip se_0; //SE
	public AudioClip se_1; //seも同様


	void Awake () {
		musics.Add(new msta("bgm_main",bgm_0)); //音楽を格納する場所 増やす場合これを増やしていく
//		musics.Add(new msta("名前",bgm_1)); //名前はなんでも。soundman.bgm="名前"で呼び出せるようになります
		musics.Add(new msta("se_buy",se_0)); //seも同じく
		musics.Add(new msta("se_gold",se_1));

		AudioSource[] audiosources = GetComponents<AudioSource> (); //プレイヤーを二つ作る
		bgm_as = audiosources [0]; //０番はbgmのプレイヤー
		se_as = audiosources [1]; //１番はseのプレイヤー
		bgm_as.enabled = false; //一旦音をオフ
		se_as.enabled = false;

	}

	void Start () {
		StartCoroutine (opbgm ()); //最初に音が出ちゃうのを防止するため0.5秒待機してからオーディオをオン
	}

	private IEnumerator opbgm(){ //その格納された場所
		yield return new WaitForSeconds (0.3f);
		if(bgms != null){ //bgmスライダーを使うなら（この行があればアタッチしてなくてもエラーにならない）
			bgms.value = PlayerPrefs.GetFloat ("sbgm",-80); //セーブされたbgm情報がなければ-80、あればそれを代入
			mixer.SetFloat("bgm", bgms.value); //その音量に変更 この"bgm"というのがMixerで設定した名前
		}
		if(ses != null){
			ses.value = PlayerPrefs.GetFloat ("sse",-80);
			mixer.SetFloat("se", ses.value);
		}
		bgm = musics[0].mname; //最初から流れる曲
		yield return new WaitForSeconds (0.2f);
		bgm_as.enabled = true; //ディレイをかけてオンにすることで暴発を防ぐ
		se_as.enabled = true;
	}

	void Update () {
		if(bgm != null){ //外からbgm命令を受けたら
			foreach (var ms in musics) { //listに入れたデータを全部参照
				if(ms.mname == bgm){ //一致するものを見つけ
					bgm_as.clip = ms.mclip; //それをクリップに入れる（音を鳴らす）
					bgm = null; //bgm命令を初期化
				}
			}
		}
		if (bgm_as.enabled) {
			if (bgm_as.clip == !bgm_as.isPlaying) { //もしbgmが終わってもまたプレイ（ループ再生）
				bgm_as.Play ();
			}
		}
		if(se != null){ //外からse命令を受けたら
			foreach (var ms in musics) { //listに入れたデータを全部参照
				if(ms.mname == se){ //一致するものを見つけ
					if (se_as.enabled) { //seオフ時に命令を受けてオン状態に変えるとその瞬間暴発するのでそれを阻止
						se_as.PlayOneShot (ms.mclip); //１度だけseを鳴らす
					}
					se = null; //se命令を初期化
				}
			}
		}

		if(tog != null){ //音オンオフのトグルを使うなら
			if(!tog.isOn){ //TargetGraphicのみの画像状態
				bgm_as.enabled = false;
				se_as.enabled = false;
			}else{ //TargetGraphicとGraphicの画像が重なって表示される状態
				bgm_as.enabled = true;
				se_as.enabled = true;
			}
		}
	}

	public void Changebgm(){
		mixer.SetFloat("bgm", bgms.value); //スライダーを動かしたらその音量に変更
		PlayerPrefs.SetFloat("sbgm", bgms.value); //すぐさまセーブ
	}
	public void Changese(){
		mixer.SetFloat("se", ses.value);
		PlayerPrefs.SetFloat("sse", ses.value);
	}

	public void seon(){ //seのつまみを動かして、タップを離したら音がなる設定
		foreach (var ms in musics) {
			if(ms.mclip == se_0){ //0に設定した音が鳴ります
				se = ms.mname;
			}
		}
	}

}

public class msta { //list情報のフォーマットを設定
	public string mname;
	public AudioClip mclip;
	public msta (string m_name, AudioClip m_clip){
		mname = m_name;
		mclip = m_clip;
	}
}

```

このスクリプトを作ると
スクリプトのインスペクタはこんな感じになります。

<img width="352" alt="スクリーンショット 2018-12-05 15.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/014ae445-b37a-c4e1-1ba4-c84382984e11.png">

もう埋まってますが、これを全部説明していきます。

#下準備
<img width="134" alt="スクリーンショット 2018-12-05 15.59.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/bcb4d07d-4e23-ede7-1c91-7fe429af2027.png">

AudioMixerを作りましょう。
Project欄のCreateからAudioMixerを選ぶと出来上がりです。

bgmとseの素材を入れておきましょう。（各自持参で）

サウンドのオンオフ画像を入れましょう。
サウンドのオンはオフの上に重ねるだけなので、透明が描けるpngが都合いいです。
　※下のは自分で描きました。使いたい方はご自由に落としてください

![speakeroff.png](https://qiita-image-store.s3.amazonaws.com/0/322674/03242451-2a14-3d86-c8db-2ead05e09195.png)
![speakeron.png](https://qiita-image-store.s3.amazonaws.com/0/322674/54e25f33-7f83-6244-1137-b4a56d78776f.png)

#AudioMixerの設定
NewAudioMixerをダブルクリックすると開くので
Groupsの「＋」を押して
グループを二つマスター内に入れておきます。
<img width="474" alt="スクリーンショット 2018-12-05 16.58.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/63995535-0dc8-f01c-7725-432c3b895ac6.png">

bgmとseのインスペクタで
AttenuationのVolumeの位置で右クリックするとこんなのが出てくるので
一番上のExpose'Volume(of bgm)'to scriptをクリック。
seも忘れずに。

<img width="368" alt="スクリーンショット 2018-12-05 16.07.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/026659ea-f1af-b33a-7d4d-e1f63102894c.png">

Exposed Parameters(2)というのをクリックして名前を変更。
「MyExposedParam」になっているので
bgmの方を「bgm」に。seの方を「se」にします。
※この名前をスクリプトで使うので必ずこの名前で！

<img width="334" alt="スクリーンショット 2018-12-05 17.01.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/25f5ad28-6c66-5902-b11d-6401ee352080.png">

#画面設定

<img width="165" alt="スクリーンショット 2018-12-05 16.12.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/ceb76b4c-336e-719a-0bd9-21306244b7ee.png">

こんな感じにするとこんな画面になります。
※スピーカートグルがでかいのは見やすさだけのためです

<img width="212" alt="スクリーンショット 2018-12-05 16.12.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/fbcd0192-747a-aaea-a37c-6a453df39dd7.png">

###Toggle

<img width="352" alt="スクリーンショット 2018-12-05 16.14.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/ba2e0892-4a2a-3c1d-6e13-acdc92023e8b.png">

「Target Graphic」にBackgroundを。
「Graphic」にBackground(1)を入れます。
このBackgroundにはImageにスピーカー画像を入れて、
Background(1)にはImageに音波マークの画像を入れます。

「Target Graphic」がオフ状態。
オンの状態になると
「Target Graphic」の上に「Graphic」が乗っかるので
もし全く違う画像を使いたい時は別の手法が必要かも。
こんな感じのスピーカーマークだとこの設定で十分使えます。

ちなみにToggleとBackgroundとBackground(1)のWidthとHeightは３つとも同じにしてください。
何か意味がない限りはAnchorも全部中央がいいと思います。
それぞれが違うと位置のズレが出ます。


###SliderとSlider(1)

ほぼ同じものです。違うところはあとで説明します。

<img width="351" alt="スクリーンショット 2018-12-05 16.19.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/8223e302-0012-28da-feab-fe6f8abfc57b.png">

ほとんど初期値のままですが、
「Min Value」を-80に、
「Max Value」を0にします。
　※-80が音量０％で0が音量100%らしいです。
　　20で音量1000%だそうですが具体的にはよく知りません。

###ちなみにスライダーについて

FillとかHandleとかBackgroundとかついてますが、
以下のようになっています。

<img width="225" alt="スクリーンショット 2018-12-05 16.22.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/8d7c022f-94f9-c138-16d7-4a6e95302063.png">

メーターだけならFillだけでいいので他をデリートしても問題ありません。
あと、どういうわけか位置を調整してくれてるので
left right top bottom全部０にしておいた方がいいかと思います。
じゃないとパラメーター０のはずがちょっとメーターが残ったりします。

###あとHandleについて

Handleとはパラメーターをグィィンと右左にドラッグするぽっちですが
ちっこいのでクリック、ましてやタップがしにくいです。
なので……

<img width="366" alt="スクリーンショット 2018-12-05 16.30.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/921dde1b-7c11-7a30-d8d7-649e98317669.png">

Handleの中にこんな感じのHandle(1)を作っちゃいます。
Handleは横幅20のサイズなんですが、
このHandle(1)は50x50のサイズになっています。
でっかいぽっちができちゃいそうですが、
これのColorのアルファ値をゼロにしてるので
このでっかいぽっちは透明なのです。
ただし、Raycast Targetはオンになってるのでクリックはできるわけです。
つまりクリックポイントがでかくなる！！
便利なので是非。

#sound

soundというオブジェクトはただのGameObjectです。
ここにAdd ComponentでAudio＞AudioSourceとやって
AudioSourceを入れます。
そしてもう一度それをやってAudioSourceを２個にします。
※BGM（音楽）のチャンネルとSE（効果音）のチャンネル

さらにこのオブジェクトにsoundmanをアタッチします。

###AudioSource

<img width="347" alt="スクリーンショット 2018-12-05 16.40.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/12705eab-eb92-6e5b-d02b-8ebb8e47f80b.png">

Outputというところに１番目のAudioSourceにはbgmを。
２番目のAudioSourceにはseを入れます。
　※右にある○みたいなのを押すと簡単に選択できます。

###再びSliderとSlider(1)

<img width="348" alt="スクリーンショット 2018-12-05 16.43.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/cd6a6957-4009-f442-5833-6f18f683e94b.png">

On Value Changed(Single)というところに設定を入れます。
右下の「＋」を押して
Runtime Onlyの下にある○ボタンをおしてsoundのオブジェクトを入れます。
bgmのスライダーは右側の選択項目からsoundman.Changebgmを選びます。
seのスライダーは右側の選択項目からsoundman.Changeseを選びます。

そしてseのスライダーにはAdd Componentから
Event＞Event Triggerを選択してこの項目を出します。
Add New Event Typeを押すと色々出てくるので
Pointer Upを選びます。（クリックやタップを離した時命令）
同じように「＋」でsoundを入れて
右の項目はSoundman.seonを入れます。

###チェック

<img width="352" alt="スクリーンショット 2018-12-05 15.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/322674/014ae445-b37a-c4e1-1ba4-c84382984e11.png">

あとはこの通りにアタッチされていればとりあえず動くはずです。

スピーカーマークをクリックすると音のオンオフになるはずです。

スライダーを動かすとbgmの方だと音楽が大きくなったり小さくなったり
seの方だと、クリックやタップを離した時にseがなって音量を確かめられるはずです。
しかもすぐにセーブされてるので次回アプリを起動した時にはその音量のまま！

ちなみに、ただ音を鳴らしたいだけならToggleやSliderはなくてもいいです。
その場合最大音量（100%）で最初からbgmが流れるだけです。
同じようにToggleだけとかSliderだけでもいいです。
Slider最小にすれば音オフと一緒だしね！


#あとは音を呼び出すだけ

呼び出し方は

```c#
soundman.bgm = "bgm_main";
```

```c#
soundman.se = "se_buy";
```

といった感じです。
どのスクリプトからでも呼び出せます。（別のシーンからでも）
seはupdate内で呼び出すと連打されるので1回呼ぶ命令でお願いします。

音楽や効果音を追加したい場合は

```c#
	public AudioClip bgm_1; //bgmを増やす場合、bgm_2 bgm_3……と増やしていけばいい

	void Awake () {
		musics.Add(new msta("bgm_main",bgm_0)); //音楽を格納する場所 増やす場合これを増やしていく
//		musics.Add(new msta("名前",bgm_1)); //名前はなんでも。soundman.bgm="名前"で呼び出せるようになります
		musics.Add(new msta("se_buy",se_0)); //seも同じく
		musics.Add(new msta("se_gold",se_1));

```

この二つを一緒に追加していきます。
　※public AudioClip bgm_1;と
　　musics.Add(new msta("",bgm_1));はセットで！

この""で囲まれている部分が呼び出す名前です。

#ふぅー

長くなりましたがこんな感じで音設定をしてました。
みなさまはどんな音設定をされてるでしょうか？
もっといい方法や改善余地があればコメントいただければ！


そして、今まで音をあまり使ってなかった方も
この記事で使えるようになれたら幸いです。

音を出したかったらサウンドマンを呼ぼう！
ではまた！ヽ(・ω・*)