Unityでライブのステージがつくりたいな・・・(曲に連動させてなにかする技術調査 part1 ~Beat Detection編~)

ちょっとライブのステージが作りたい。
というかライブ行きたい。コールがやりたい。
ということでつくる！道のりは長いぜ！

はい、で、今回は曲に合わせて動かすギミック周りの所の技術調査。
ステージのモデリングに入りたいけどステージのデザインが浮かばないので後回し。

曲と連動してというので私が持ってるアセットは二つ
###Beat Detection
こちらは曲をセットすると再生時に自動でイベント呼んでくれたりするやつ。
取れるパターンがいくつか決まっている。
自分で好きなタイミングにとかそういうことはできないが、いちいち全部セットするのめんどくさいとか
精度がそこまできっちりしていなくていいならこっちが楽。
<a href="https://www.assetstore.unity3d.com/jp/#!/content/19020" target="_blank">Beat Detection</a>

###Koreographer 
こちらはProfessional Editionと価格で二つ種類があります。私がもってるのはProfessionalの方。
こちらは自分で事前にイベントを呼ぶタイミングや、テキストなどいろいろ設定できるが、設定するのはそれなりに時間がかかる。
しかし、曲に合わせたカラオケのような歌詞表示や、音ゲーのノードなどの作成には特に便利！
<a href="https://www.assetstore.unity3d.com/jp/#!/content/44270" target="_blank">Koreographer Professional Edition</a>
<a href="https://www.assetstore.unity3d.com/jp/#!/content/54639" target="_blank">Koreographer</a>

##Beat Detectionみてみる
まず簡単なこっちを。インポートしたところ。うん、シンプル
<img width="229" alt="スクリーンショット 2016-08-26 11.45.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/189f489f-a1e5-8481-fb24-78eceb89a657.png">

Scriptもすくないのでシーンを見てスクリプト読めばOKな感じ。
Demoはこんな感じ。(gifなので音なくてごめんなさい)
![BeatDetection.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/e8927899-11e5-b096-68f0-ba99a5311adc.gif)

曲を変えるときはCameraにくっついているAudioSourceのAudioClip変えるだけでその曲に合わせて動いてくれます。
<img width="370" alt="スクリーンショット 2016-08-26 11.47.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/0a9688d0-43a2-5543-95cd-e362d3cd1a9d.png">

##自分で設定してみる
ではいちから自分で設定してみる。
新しいシーンのカメラにAudio SourceとBeat Detectionをアタッチ。
Beat DetectionのBeat Modeは3つ。Energy Beatのみか　それ以外か　両方か。
今回は両方のまま4つ取る感じでいきます。

まぁサンプルのScriptまねるだけだけど・・・。
こんな感じにフリー素材のイラストを落としてきて配置してみました。
画像は<a href="http://sozai-good.com/" target="_blank">こちら</a>の素材利用しております。
これをリズムに合わせて画像差し変える感じで。
<img width="412" alt="スクリーンショット 2016-08-26 12.13.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/59d643d2-5dfe-4294-351d-07883d658fc3.png">

あとは空のオブジェクトか何かに下記のようなスクリプトをつくってそれぞれ画像などアタッチ

```charp

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class BeatDetectionTest : MonoBehaviour {

	public GameObject AudioBeat;

	public GameObject genergy;
	public GameObject gkick;
	public GameObject gsnare;
	public GameObject ghithat;

	public Sprite[] genegySprite;
	public Sprite[] gkickSprite;
	public Sprite[] gsnareSprite;
	public Sprite[] ghithatSprite;

	void Start () {
		AudioBeat.GetComponent<BeatDetection>().CallBackFunction = MyCallbackEventHandler;
	}

	public void MyCallbackEventHandler(BeatDetection.EventInfo eventInfo)
	{
		switch(eventInfo.messageInfo)
		{
		case BeatDetection.EventType.Energy:
			StartCoroutine(CharAction(genegySprite, genergy));
			break;
		case BeatDetection.EventType.HitHat:
			StartCoroutine(CharAction(gkickSprite, ghithat));
			break;
		case BeatDetection.EventType.Kick:
			StartCoroutine(CharAction(gsnareSprite, gkick));
			break;
		case BeatDetection.EventType.Snare:
			StartCoroutine(CharAction(ghithatSprite, gsnare));
			break;
		}
	}

	private IEnumerator CharAction(Sprite[] spriteList, GameObject obj)
	{
		obj.GetComponent<Image>().sprite = spriteList[1];
		obj.GetComponent<Image>().SetNativeSize();
		yield return new WaitForSeconds(0.2f);
		obj.GetComponent<Image>().sprite = spriteList[0];
		obj.GetComponent<Image>().SetNativeSize();
		yield break;
	}

}

```

はい、完成(gifだから・・・音ないけど)
![BeatDetection2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/05656d71-7767-10dc-2f5f-1b422f242182.gif)

うん、音に合わせてなので思った通りじゃないかもだけど、ライブの背景のちょっとしたパーティクルとかのレベルであればこれつかえば楽そう。

しかしやりたいことはこれだけではできないのでもう一つの方もやる
そっちは長くなりそうだから今回はここまで。