[Unity]声優ハッカソン参加してきました「彼氏力お化け屋敷」

2/26,27に行われた #rakkathon2 声優ハッカソンに参加してきました。
チームfoursevenにて「彼氏力お化け屋敷」というゲームができました。

![CcSSru1UYAE6lZ6.jpg](https://qiita-image-store.s3.amazonaws.com/0/96808/7257cb19-0a5f-0643-3ac2-ee4a904857c0.jpeg)

#ゲーム内容
スライドシェアに詳しくあります
http://www.slideshare.net/ajimitei/ss-58807419
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/712f2ff4-324c-f6a0-b5e3-bd97701b07bc.png)

#テーマ
声優の声を使ったアプリを作る。

といった内容で、1チーム3回、30分までの収録の権利が与えられているとても珍しい（世界初？）のハッカソンでした。
Unityも協賛していたので、ゲームジャムの色もあり、ゲームが多いハッカソンというのも珍しいかも。

# チーム分け
全25チームで、20チームくらいはあらかじめチーム登録していた様子。

自分は個人参加で、何か席順のようなものですでにチームが割り当てられていました。
4人席で、近くのチームが2人、さらに1人だったので、
一緒にやりましょうと、その場チームを２つ（３つだったのかな？）組み合わせた形で、最終的には7人のチームになりました。
(チーム23+24合同=47 チームfourseven)

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/ce2c6f2a-d93f-4463-fc61-9088c363289f.png)

各チームごとに会議室が割り当てられて、壁が全面ホワイトボードでした。
企画の学生プランナー1人、アイデア系1人、
プログラマ4人、サウンド1人といった感じ。
みんなUnityは少しといった感じだったけど、Unityで。

Live2D使うとか、アセット使うとか色々駆使していました。

#収録
##収録の内容決め
情報共有はSlackを使い、仕様決めはgoogleドキュメントやスプレッドシートを使いました。
ファイル共有はbitbucketを使いました。(人数多かったのでプラン変更してみた）

で、シチュエーションごとにセリフをみんなで考えるという形で行いました。
googleドキュメントに匿名でアクセスして、みんなが好き勝手に妄想したセリフが書き込まれていきます。

最初の収録では、全員参加で立ち会いました。

##収録後の波形切り出し
![CcNmllXUYAAdtKj.jpg](https://qiita-image-store.s3.amazonaws.com/0/96808/280fccfa-b7fe-b4b3-9cbf-393eef78a120.jpeg)

最初の波形は仮データということですが、91波形にもなりました。
これらの名前ルールとか時間がないので、

``` 
キャラ名／シチュエーション名／セリフのローマ字読み（バリエーションは番号づけ）
kanojyo/start/kocchi.wav
okan/end/kanojyodatoomottazannenn.wav
``` 

みたいな形で、なんとか波形名から推測可能な名前で用意。

ADX2LEの機能で、フォルダ名と波形名はそのままキューリクエスト名になるので、それを利用してプログラムからもキュー名で呼べるようにした。

![CcNtq1rUMAAiL9A.jpg](https://qiita-image-store.s3.amazonaws.com/0/96808/fea0b2ee-b68d-69ed-8689-1da4ce4ce5af.jpeg)

##サウンド作業の分業
![名称未設定 3.png](https://qiita-image-store.s3.amazonaws.com/0/96808/a42c8511-1098-de16-f1d7-1f3c62716a91.png)

声優ハッカソンならではですが、サウンドの調整にはとても時間がかかります。
参加者はみんな声優に愛があるようですので、これらの工数は無問題でしたが、時間に追われるハッカソンとなりました。
今回のチームは人数が多いので、分業できました。

- ディレクション（プランナー１人）
収録した声をどのキャラクターのどのタイミングに割り当てるか
最終調整など。
googleドキュメントに書く。
収録に立ち会う。

- 収録班（収録エンジニア１人）
声優さんの声を録音する。音割れとかしないように。

プランナー（声優ディレクション）は
その場に応じて少し余計にバリエーション増えたなど
リストも更新する場合もあるが今回は省略。
（波形切り出し時に、切り出し班が問い合わせる形）

- 波形切り出し（サウンドエディター１人）
サウンド班は切り出し作業に時間を割かれる。
30分の収録の切り出しは1時間くらいかかっている。

時間がないのでリストとか作らず
切り分け、ローマ字wav化で波形判断できるようにしている。
前後の無音のトリミングのみ。
（音質調整や残響除去とかはしない)

- ゲーム中の演出調整（プログラマー１人）
タイミングやどれを鳴らすかなど演出のタイミング調整はプログラマにお願い。

- 音量、発音管理（サウンドデザイナー１人）
ADX2LE上で、カテゴリの設定、発音数リミット設定、音量調整
キュー名をgoogleドキュメントに書く


##収録環境
会議室をそのまま利用した形のため、反響が多く取れてしまう状況でした。
（床、天井、壁、すべて硬い材質だった）
外走っているバイクの音とかもかぶってしまったり。
ただ、録音のエンジニアさんが付いていたので、安心でした。

うちのチームはgoogleドキュメントとかでシチュエーションごとに台詞内容募集し、収録時はPCで見せながら行った。
（モニター時に何かPCのハードディスクアクセスっぽいキュルキュルいうノイズが聞こえたけど、録音した素材は問題なかった様子）

波形切り出した後の名前のローマ字化やフォルダ名ルールを決めて最終的には174ファイルできた。

音割れしたものは使用しない方向で切り捨て。
反響除去とかバイクノイズが乗ってしまったものも切り捨て。

![10426756_1149009525139388_3983921115622058048_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/96808/0e98930c-3557-0da8-f1d5-be5621d68a2b.jpeg)


##他のチームの様子（波形数、収録の工夫など）
他のチームはどうしたのかなと、
懇親会の時に、いくつかのチームの声の切り出し担当者に話しを聞いた所・・・

- ある人は200~300ほど切り出したり、
- ある人は10分くらいのラジオドラマほどのシナリオを書いたり、
- ある人は反響を消す作業に費やしたり、
- ある人は3人それぞれ30個ほど切り出したり。音響解析用ツール（？）で数値指定で切り出ししている人とかもいた。

あと、ADX2LE使っているチームが他にもあって
これくらい音数あると圧縮の有り難みがでてくる様子。　

シナリオが決まっている場合は、番号管理、バリエーション番号とかいった慣れた人もいたみたい。

一人で組み込みまでやるなら自由に名前決められるけど、どこまでが切り出しポイントかとかの把握とか命名規則とかいろいろ。チームの数だけ経験値が上がっているはず。
何より、声優さん大好きな人の集まりなので、とても大事に扱っている印象だった。すごいよかった。またやってほしい。

収録準備や、収録後の編集（トリミング、調整、ノイズとか取ったりとか）とかにどれくらい時間を割けるかといったことなど、いろいろ勉強になったはず。

#「こっちだよ」の３Dサウンドテスト
収録した音を鳴らしてみる。やっぱり声はいいなぁ。
声優さんパワーすごい
ToSpeak合成音、声優声（彼女、オカン）
動画：
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/XRSBQ64_EXM/0.jpg)](http://www.youtube.com/watch?v=XRSBQ64_EXM)

#ハコスコ対応
![IMG_3952.JPG](https://qiita-image-store.s3.amazonaws.com/0/96808/39e7bae1-1677-325a-8eda-9954dcf0b1a3.jpeg)

ハコスコで360度ぐるぐる回ると音が聞こえて来る
キャラクターにコリジョンが付いていて、それぞれスクリプト上でランダムにキュー名がリクエストされるようにできていた。

##リアルなインタラクティブ3Dサウンド体験
![こっち.png](https://qiita-image-store.s3.amazonaws.com/0/96808/b98d330d-aed9-0a38-6229-df8d97148a2c.png)


ハコスコ状態で端末をぐるぐる回転させます。

つまり、スピーカー位置（端末）をリアルに360度回しているので、彼女のいる方向から声がすることに。

スピーカや出力チャンネル数はモノラル(1ch分)で良い。
マルチモニターじゃなくても360度体験できると同じ理由、目の前の音だけしっかり鳴ればOK。
（前後左右なので2Dかもですが。）

#サウンドシステムの設計

今回は時間もなく、素材が膨大ということで、
すごいシンプルにしたかったので、以下のようなサウンドマネージャー。

演出担当分け

- ランダムな選択再生やタイミング調整は組みこみする人(Unityのスクリプト書く人）に全てお任せ。

- 音量と発音数管理、エンベロープリリースのみADX2LEのツール側で設定するようにした。

再生のみが行えるようにし、ほかの全ての機能を隠すことにより、
インターフェース（操作する部分）はとてもシンプルになり、理解が早く済むようになる。
タイミングや切り替えなどの制御は、ほかの画像の処理とかと同様にUnityのスクリプトで行えるようになる。（サウンドプログラマでなくても扱える）

##シンプルなサウンドマネージャー
スクリプトから

``` example.cs
SoundManager.Play("arigato");
```

これだけで「ありがとう」と再生できる。

``` SoundManager.cs
using UnityEngine;
using System.Collections;

public class SoundManager : MonoBehaviour {
    CriAtomSource source; 
    public static SoundManager main = null;

    void Awake()
    {
        if (main == null)
        {
            if (main != null)
            {
                GameObject.Destroy(main.gameObject);  
            }
            main = this;
            GameObject.DontDestroyOnLoad(this.gameObject);
        } else
        {
            GameObject.Destroy(this.gameObject);
            return;
        }
    }

	void Start () {
        source = this.gameObject.AddComponent<CriAtomSource>();
	}

    /// <summary>
    /// 再生関数
    /// </summary>
    /// <param name="cueName">Cue name.</param>
    /// <param name="atomSource">AtomSourceを渡せばその位置から再生も可能</param>
    static public void Play(string cueName,CriAtomSource atomSource = null)
    {
        if(atomSource != null)
        {
            //Debug.Log("atomsourceあり" + atomSource.transform.position);
            atomSource.cueSheet = "CueSheet_0";
            atomSource.cueName = cueName;
            atomSource.use3dPositioning = true;
            atomSource.Play();
        } else {
            main.source.cueSheet = "CueSheet_0";
            main.source.cueName = cueName;
            main.source.Play();
        }
    }
}
```

##視線があったら再生する

``` RaycastManager.cs
Ray ray = mainCamera.ViewportPointToRay (new Vector3 (0.5F, 0.5F, 0));
RaycastHit hit;
if (Physics.Raycast (ray, out hit)) {
　if(hit.transform.name == "Kanojyo")
  {
     SoundManager.Play("kocchidayo");
  }
}
```
といった仕組みで行った。

声は
カテゴリのキューリミット「voice」を用意し、1音にすることで、声が重ならないようにしている。後着優先なので、次の声が鳴ると前の声は途中で遮られる。

##BGMの再生／停止

``` Bgm.cs
SoundManager.Play("bgm"); // 再生
SoundManager.Play("stopbgm"); // 停止
SoundManager.Play("goodend"); // 正解
SoundManager.Play("badend"); // 間違い
``` 

音楽の制御はこれだけのキュー。
カテゴリのキューリミット「bgm」を用意し、1音にすることで、音を止めるのもキューの再生で行っている。







#お昼はとんかつ
![IMG_3948.JPG](https://qiita-image-store.s3.amazonaws.com/0/96808/15d5a40e-56bf-4d1d-c68b-cebdb6d0e670.jpeg)
ここのとんかつはとても美味しかった。初日のお昼に行きました。
http://futako-tamagawa.net/detail/index_22.html

#最後に
![IMG_3954.JPG](https://qiita-image-store.s3.amazonaws.com/0/96808/06225f03-ed8e-acf7-8c43-96ba2c17db86.jpeg)
即席チームでしたが、なんとかものができてよかった。
12時くらいに一つ動くものができたので、安心できたのがとてもよかった。余裕大事。