【Unity】サウンドマネージャなんて使わない簡単効果音スクリプト

# Unityで音をつけるってどういうこと？

随分前に[SoundManagerのスライド](http://www.slideshare.net/tatmos/tech-buzz8-unity-study-20120927-tanaka)を上げたのですが・・・

少し凝った事をしたい時用でして、実はもっと手軽に音が鳴るんじゃないかと

そこで、Unityのゲームに音をつける話をしようかと思います。

##用語
- スクリプト・・・　プログラムのこと。C#言語で書く。
- Unity・・・　ゲームが作れる環境。無料で始められる。
- 効果音・・・ 音のこと。
ゲームの音のほとんどは効果音でできています。
そして重要な音はほとんどプレーヤーキャラクターの動作音になります。
- ゲームジャム　短時間でゲームをつくるイベント。

##なぜ音をつける？
音をつけるだけですごく楽しくなる
ゲームジャムとかの経験上、音がついたら途端に面白くなります。
ゲーム作りのモチベーションも上がるとおもいます。

##全体の流れ
- 音作り
- 音のUnityへの登録
- スクリプトを作り、ゲームオブジェクトに貼る
- ゲームオブジェクトに音を登録する
- スクリプトで鳴らす

#まずは音作り
効果音は音楽ソフトで作るのが簡単です。
僕はLogicを使って作ります。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/aacce86b-843b-d145-3548-6aa96ad78807.png)

ものにぶつかった時の音を作りたかったので、bounceとかついている名前をライブラリから検索。適当にパラメータを弄って思った音を作ります。

効果音の作り方は十人十色、他にもいろいろあります→[SIG-Audio#11 効果音制作ベストプラクティス（前編）](http://igdajaudio.blogspot.jp/2015/11/sig-audio11.html)

#波形をUnityへ登録

バウンスし、波形素材にしてUnityにAudioフォルダとか作って波形をドロップして追加します。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/5545abba-ac86-2db0-1baf-10e4c687edaf.png)

#Unityのインスペクタで音を設定する

順番前後しますが、
最終的に、プレーヤーとかの動作させるスクリプトに間借りして
音の登録をして音を鳴らせるようにします。

![audioclip追加.png](https://qiita-image-store.s3.amazonaws.com/0/96808/8cbdba35-fef4-6662-c8e1-570e76fe0091.png)

だいたいプレーヤーが鳴らしたい音はプレーヤーの動作をさせるスクリプトに追記します。

一度鳴るように設定すれば、後は波形を差し替えるだけでスクリプトを弄らずに調整ができるようになります。

このやり方なら後で数を増やしたりも簡単です。

#用語（スクリプト編）
- オーディオソース
```
AudioSource audioSource; 
```
これは音を鳴らすプレーヤー（CDプレーヤーとかの方）みたいなもの。これで音を鳴らす。
名前がソースなのは３Dオーディオでリスナー（マイクのこと）と音源（ソース）といった考えがあってのことなのですが、今回は2Dゲームなのであまり気にしない。

```
audioSource = gameObject.AddComponent<AudioSource>();
```
Unityでオブジェクトが生成された時に一度だけ呼ばれる
Start()関数でコンポーネントを追加しています。
これで、音を出す準備ができる。

- オーディオクリップ
```
public List<AudioClip> audioClip = new List<AudioClip>();
```
どの音を鳴らす？
音を鳴らすには、鳴らすものを指定する必要があります。

オーディオクリップはプレーヤーに対してセットして音が鳴る。

##波形ファイル＝オーディオクリップ
波形ファイルはUnity上ではオーディオクリップというアセットに変換されて登録されているので、
これを指定する。
Listにしているのは、後でインスペクタで複数指定する時に便利なので。
数が増えてもスクリプトの書き換えを最小限にすることができます。
リスト管理なので簡単になります。

##リストを扱うおまじない
ちなみにリストを使うために上の方で
```
using System.Collections.Generic;
```
を宣言しています。


## 鳴らすところ
```
audioSource.PlayOneShot(audioClip[0]);
```
鳴らしたいところで、上のように再生指示をしてやると鳴ります。
[]カッコ内の数が登録した波形番号になります。
リストの0番目を鳴らします。　（プログラムは0番から数えることが多い）

他の音を鳴らしたい場合は番号を変えればOK

## スクリプト全容

EasyTouchを使ったサンプルコードなので、持ってない人はこのまま動かないとは思いますが、必要なところを抜き出して使用してもらえればと思います。

実質5行コピペするだけ。

``` player.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic; // ここコピペ

public class player : MonoBehaviour {

	AudioSource audioSource;  // ここコピペ
	public List<AudioClip> audioClip = new List<AudioClip>();  // ここコピペ

	// Use this for initialization
	void Start () {
		audioSource = gameObject.AddComponent<AudioSource>();  // ここコピペ
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnEnable(){
		EasyTouch.On_SwipeStart += On_SwipeStart;
		EasyTouch.On_Swipe += On_Swipe;
		EasyTouch.On_SwipeEnd += On_SwipeEnd;		
	}
	
	void OnDisable(){
		UnsubscribeEvent();
	}
	
	void OnDestroy(){
		UnsubscribeEvent();
	}
	
	void UnsubscribeEvent(){
		EasyTouch.On_SwipeStart -= On_SwipeStart;
		EasyTouch.On_Swipe -= On_Swipe;
		EasyTouch.On_SwipeEnd -= On_SwipeEnd;	
	}
	
	// At the swipe beginning 
	private void On_SwipeStart( Gesture gesture){
		audioSource.PlayOneShot(audioClip[0]);  // ここコピペ
	}
	
	// During the swipe
	private void On_Swipe(Gesture gesture){
	}
	
	// At the swipe end 
	private void On_SwipeEnd(Gesture gesture){
		// Get the swipe angle
		float angles = gesture.GetSwipeOrDragAngle();
		Debug.Log("Last swipe : " + gesture.swipe.ToString() + " /  vector : " + gesture.swipeVector + " / angle : " + angles.ToString("f2"));
		this.gameObject.GetComponent<Rigidbody2D>().AddForce(gesture.swipeVector*0.1f,ForceMode2D.Impulse);
	}
}
```

# 壁にぶつかった時の音を追加する

```
	void OnCollisionEnter2D(Collision2D coll) {
		audioSource.PlayOneShot(audioClip[1]);
	}
```
これで、壁に当たった時に別の音が鳴るようになります。
【動画】https://youtu.be/Sx02sD05OWI

こんな感じでどんどん音をつけていくと楽しくなります。

# 領域に入ると音が鳴るみたいな演出の場合
isTriggerを有効にして

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96808/6c04c369-37f4-5c1c-f858-9af5570247ec.png)


```
    void OnTriggerEnter2D(Collider2D collision)
    {
        audioSource.PlayOneShot(audioClip[1]);
    }
```
とかになる。　
エリアのBGM切り替えとか環境音とかに使える。

##参考動画
【動画】https://youtu.be/N1CRkYDI6FM

##今回のポイントは３つ
* スクリプトはなるべく少なく。（なんとたったの５行）
* スクリプト初心者向け（サウンドの人でも分かるように）
* 拡張性も少しある

#さらに高みを目指すなら
凝ったことなら[ADX2LE](http://www.adx2le.com/)を使うとすこし楽できるとかもあるけどそれはまた別の機会に