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

<a href="http://qiita.com/ayumegu/items/11d107dde0f087355ee4">前回</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>

##では早速
まずはインポートして、Projectの一番下、KoreographyとKoreography Trackの二つをとりあえず作成
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/ae34d06c-3afd-67fe-f131-f069b2a2b23b.png" height="400px">

適当に名前変えて・・・
![スクリーンショット 2016-08-25 21.52.56.png](https://qiita-image-store.s3.amazonaws.com/0/46444/c5587344-34f5-3a3c-927b-2ab29518822e.png)

紫色の方のインスペクタ下のM Tracksっていうところにオレンジ色のTrackをセット。

そして上のOpen In Koreography Editor
![スクリーンショット 2016-08-25 21.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/46444/850b1968-9160-2b6a-710b-55678b23aca4.png)

はい、ウィンドウでてきました。
ここのTrack Event IDにとりあえず適当に名前をつけて・・・
![スクリーンショット 2016-08-25 21.54.59.png](https://qiita-image-store.s3.amazonaws.com/0/46444/1184c454-a5e0-3ce6-7067-941b48746a11.png)

するとTrackの方にM Event IDが定義されます
![スクリーンショット 2016-08-25 21.55.06.png](https://qiita-image-store.s3.amazonaws.com/0/46444/81ce582b-120e-a18b-f61a-01914813ef7e.png)

で、ウィンドウに戻って、Audio Clipに曲をセット。
するとこんな立派なウィンドウに。
ちなみにここのTrack Event IDのところのNew で新しいTrackファイルや既存のTrackのロードできますね。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/e8b81054-fdfb-49c0-0647-79407c156167.png" width="600px">

では早速設定してみよう！

##操作方法的な
イベントの設定はDrawを選択して、OneOffがキーみたいな感じでSpanの方だと範囲選択ができます。
移動などはSelectにして動かせます。細かい時間の設定やイベントの設定は設定したノード?をクリックすると下に設定がでるのでそこで調整できます。
また、任意のところから再生するときは右クリックからPlayFromHereでできます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/0b55bcc0-4e3a-ed7c-d7e9-d27d96c34b2b.gif" width="600px">

イベントはテキストやfloatなどの数値、colorなど好きなものを設定できるので必要なものを選びます。
すべて一緒であればPayloadのところをTextなどにしておくといちいちプルダウンで選ぶ必要がなく便利です。

##早速組み込んでみる
今回はone offのテキストでやってみます
イベントが呼ばれたら画面上に3Dテキストを表示するようにします。

```csharp
using UnityEngine;
using System.Collections;
using SonicBloom.Koreo;

public class CallManager : MonoBehaviour {

	[EventID]
	public string callEventID;

	public GameObject callPrefab;
	public Transform callParent;

	void Start () {
		Koreographer.Instance.RegisterForEvents(callEventID, ShowCall);
	}
	
	void ShowCall(KoreographyEvent koreoEvt)
	{
		StartCoroutine(ShowCallAnim(koreoEvt.GetTextValue()));


	}

	private IEnumerator ShowCallAnim(string callText)
	{
		GameObject obj = Instantiate(callPrefab) as GameObject;
		obj.transform.parent = callParent;
		obj.transform.localPosition = Vector3.zero;
		obj.transform.localScale = Vector3.one * 0.5f;
		obj.GetComponent<TextMesh>().text = callText;
		yield return new WaitForSeconds(1f);
		Destroy(obj);

	}
}

```

[EventId]をするとインスペクタ上のEvent IDがプルダウンで選べるようになるので入力ミスがなくせます。
あとはイベントをこんな感じで設定して、表示周りつくって・・・本当はこういうときのオブジェクトはプールするようにしたいけど今はとりあえずいいや
<img width="347" alt="スクリーンショット 2016-08-26 22.40.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/1519cdba-a078-087d-a90c-d1f08b96e92d.png">

###カラオケみたいなところ
Demoにあったのですが、カラオケの歌詞みたいなことが出来ます。
こんな感じ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/8d2084d4-74e2-ed7d-3b33-e92c00f4c36f.gif" width="400px">

こちらDemoのkaraokeのやつをちょっといじっただけです。
仕組みとしてはTrackは二つ。歌の部分のやつと、歌詞を表示するタイミングのやつ。
歌の部分のやつはSpanで範囲指定でtextを設定、
歌詞表示タイミングはOneOffでtextを設定してます。

UIまわりでは同じテキストを白　赤かさねて、maskで設定に合わせて動いている感じです。

まぁそんなこんなでこんな感じになりましたw
![AyumeguSong2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/3abf5493-5030-ab4a-0c93-327c67bf22c2.gif)

ふふふ、これで曲連動は大丈夫そうかな。
他にもColor float いろいろあるから、ライトとかにも使えるしいろいろ使い道がありそうです。

追記
リップシンクみたいなのも手動でいけそう
自動でやって欲しい気もするけど、いまいち自動のもきっちりやってくれない印象があるので、
特にハモりとか余計な音声が入る歌だと変なの拾っちゃうし・・・ということで。
ついでだしこのアセットで手付けでやってみた。
まとかぱとか一回口閉じないといけないところとかまで設定する必要があるかどうか謎だけどw
まぁいい感じ。これをモデルのblendshapeとかに渡せばOKっぽそう。
![LipSync.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/28656a5b-0d0a-9215-faca-12d11055559e.gif)

あいうえおんで歌のところに合わせてtextを設定して、イベントが来たらそれに合わせて画像を変えているだけです。

```csharp
	[EventID]
	public string lineEventID;

	public Image lipImg;
	public Sprite[] imgList;

	void Start () {
		Koreographer.Instance.RegisterForEvents(lineEventID, OnLipSync);
	}
	
	public void OnLipSync(KoreographyEvent koreoEvt)
	{
		string text = koreoEvt.GetTextValue();	

		switch(text)
		{
		case "あ":
			lipImg.sprite = imgList[0];
			break;
		case "い":
			lipImg.sprite = imgList[1];
			break;
		case "う":
			lipImg.sprite = imgList[2];
			break;
		case "え":
			lipImg.sprite = imgList[3];
			break;
		case "お":
			lipImg.sprite = imgList[4];
			break;
		case "ん":
			lipImg.sprite = imgList[5];
			break;

		}

		lipImg.SetNativeSize();
	}
```

次は演出に使えそうなShader系でも。