OculusGameJam2013のとあるチームの記録(コエカタマリン)

# 今更だけれども…
- (壁に向かって)言い訳
 - 当時、どこかに投稿を前提に記録を残していたものの、お仕事的なところでマスターアップ期間だったり超絶に忙しかったので結局整理しないままになっていたモノを発掘
 - 整理しようかなー、あれ…、もう後６時間で2014年のOGJじゃないか！無理！

## というわけで
- 結局チラシの裏的なメモでしかないけれど、何かの参考になればと投稿してしまおう
- githubに当時のソースはそのまま上がってます。
 - https://github.com/haiatto/OGJ_Koekatamarin
 - ただし、手動でnodejsと連動させないとダメなので、結構面倒です。
 - 実際のところはこんな突貫初心者ソース薫るカオス風味、なコードを見るより、凹みチップスの御方がとても良い感じの記事を書かれていたのでそちらが超おすすめです！
 - [Chrome の音声認識を Unity で利用してみた](http://tips.hecomi.com/entry/20131202/1386004185) とか 
  [これ](http://tips.hecomi.com/entry/2014/04/15/011255) とか
  [これ](http://tips.hecomi.com/entry/2014/04/21/001606) とか。

# 前置きはこれくらいにして…
- 以下、チラシの裏的当時のメモです。
- 手直し、推敲、出来てないので正に草稿デス
- 雰囲気くらいなら伝わるかも（当時の徹夜明けのテンションで書いた）
- 何かの参考になれば幸いデス

# 当時のログ

h
unity初心者、ゲーム目的で触ったこと5日間くらい。
ゲームプログラマーという肩書きは持ってる。
これ書いてる人。

t君
unity使い初めの大学生。
なかなかデキるひと。
徹夜も厭わぬ。
unity仮面に指導を受けたとの事。

## am 0930
会場入り。人いっぱい！

## 1000
アイデアプレゼンタイム！
数あるプレゼンの中で
goroさんがコエカタマリンのアイデアをプレゼン。

自分はコエカタマリンで対戦するくだりに、すぐさまイメージが湧きあがった。
そして、光るものを感じたコレに決めた(自分のアイディアは全く誰にもかからなかったと言う理由は内緒…)

## 1030

2人組で開発スタート！
まずはマイクの調達から。
goroさんに聞いたら、何と買い出しついでに買ってきてくれるとの事！
そして音声認識の手段探しを開始する。
ちらっと検索してもunityで音声認識見つからなかったので、
2人でunity仮面に知恵を借りに。
unity上では無さそうなのでjuliusなんてどうかと勧められる。
unity仮面は過去、直接組み込みでは無くて、ローカルでunityと通信する形でやりとりして音声認識やった事あったそう。実はちょっとだけjuliusで遊んだ事あったので、その方針で行こうといったん決定！

## 1130

自分はjuliusを落として認識部分を研究。

t君は声塊の表示部分を作り始める。
声は3Dメッシュに変換する形でやる事に決定。
unity仮面に相談しつつ丁度良さそうなアセットをストアから落としてきたt君。

…実は結局使わなかったのだけどそれは後の話。

## 1230

音声認識でjulius使うのを諦める。(早い？)
cベースのライブラリをビルドして通信するのもありかもとは思ったけどトラブルあると時間かかりすぎて危ない。
方針転換。webサービスを探す。
unity仮面からも時を同じくしてそのままズバリな助言を貰う。
次の作業はサービス探しに確定。

この時点でt君の声塊表示は結構順調だった。

## 1330

周りのプロジェクトの人達と話したり時々覗き見に行ったりしながら楽しく開発。

自分の所はと言うと…見つかるwebサービスはことごとく使い物にならないものか、有料ばっかり。

t君の進める声塊表示はサンプルまでサクッと出来てた。
が、なんとここでアセットストアのものは動的にメッシュを作れないらしい事が判明！
オーサリングツールだったらしく、悩んだ末に使用を断念する事に。
で、ちょっと先ずは手抜きで、3D空間上にテクスチャで文字出して何枚か重ねれば、ひとまずいいんじゃない？
と話が発展して実装開始。

## 1400
webサービス探し中に見つけたchromeでしか使えないjsのサービス <ここにapi名とリンクを>
これ、かなり認識率が最高。
誤認の時も面白いのでコレにしたい。
でもchrome上でしか動かないし…

t君の作った3dテクスチャ版、かなり良い感じに出来てた！
重ねた真ん中の色を変えたりとニクい技を入れてあったりしてナカナカ立体に見える。
このままでいいじゃんと方針決定。
ここから物理挙動と発射処理を実装開始。

## 1500

時々見に来てくれるgoroさんとお話し、初期kinectの時はunityで使えなかったからUDPでやりとりしてたよーなどなど実用的な話しで盛り上がる。

ただ、webブラウザなのがネック。
拡張機能をプラグインするかとか考えた末、websocketで通信する事に決定する。
使った事無いけど便利なのは知ってた。学習開始！

声塊表示は超順調。

## 1530

遅いお昼を採りに2人で外食。
孤独のグルメに出てきそうな地元感のあるとんかつ屋に。
ついでにコンビニで、お菓子を買い出し、机の上にお菓子山を建てる。

## 1700

unity上でwebsocketサーバを作ろうかと思ったけれどプロトコルの仕様書みてウゲゲゲェとなったので諦める。
素直にnodejsでサーバー作り。
<ここにリンク>
いやぁホントなに悩んでたのかと簡単すぎて最高。

声塊表示は結構楽しく出来てきた。
t君のセンスで細かく調整入ってきてる。

## 1800

unity上でwebsocketの実装の為に
<ここにリンクを>
をビルドして放り込む。
しかし謎のエラーが出来て動かず…
unity仮面団に相談しつつ、ふと思いついて.net4.5を3.5に変えてビルドしたらアッサリ解決。よかった。
これで懸念事項なくなった！

## 1900

夕御飯を求めてお隣の2つのプロジェクトの人達と夜の渋谷へと繰り出す。
6人が仇となり中々場所が見つからず最後は舞い戻って近くのココイチで解決。

## 2100

周りのプロジェクトが段々賑やかになってくる。なんか凄いのが隣で動いてる…上下するチクワ…
じゃなくて…そっちは気にしたら負け…その反対方向の進撃のホラー、ミクだよーさん。ホラー過ぎてステキ。画面綺麗だなぁ…
ちらっと自画面見ると単色の空間。
…プレッシャー最高潮！
あと20時間…という言葉がちらほら。

## 2130

コエカタマリンのプロトタイプが出来上がる。
なかなか良い感じ！
認識した文字を長いまま流したり、時々chromeのapiがタイムアウトしたり問題は残しつつ、だけど。

どんどんコエが飛んで行って地面が声だらけに！

## 2200

goroさんやunity仮面が時々見に来てくれて、t君共々、色々アドバイスをもらって作業が捗りモチベーションアップ。
ここら辺より、とりあえずUSBメモリにて2人間のプロジェクト共有開始。

## 2300

ニコ生開始！ ちょこっと動いた画面が映った。

そろそろプロジェクト共有の方法に悩み始めて2人共初めて使うgitを選択。お隣も使ってるしと気軽に。

…まさかここから長い道のりが待ってるとも知らずに…ね。

## 2330

アカウント作ってgitで共有開始！
とりあえず2人共に全部放り込む。
ツールはgithub for windowsにて。

…この時の選択が後々面倒な結果を生むことになるとは知る由もなく…放り込んだ。

## 2345

libraryとtempは共有しちゃダメだよ？
とお隣よりアドバイスを受ける。
ジーザス！もうやっちゃったよ！

t君主導で除外設定を追加に追加に追加かかか…

## 2400

でも手遅れだったみたいでgithub for Windows でsyncとやるとエラーが出まくり2人とも完全に詰む…

仕方なくファイルを消してリポジトリから…と思ったらsyncすると削除しようとしてる…
これは…svnの経験だけでは使いこなせない…

そこで、疑問と予感を感じてトータスgitを入れてみたら望んだ構造がそこにある！即刻、t君と共に乗り換える。
さらばgithub for windows

## 2430

完全に2人共詰んだ…
何やってもサッパリ。
goroさんに助けを求めて見る事に…

おお、なんかサクサク解決してゆく。
エラーの内容の理解がちょっと出来てきた！

除外設定も増えて、metaを生成する設定の事を教えてもらい目から鱗。

エラーが全部消えてスッキリ。

## 2450

goroさんに感謝しつつ、改めて共有開始。
あれ…こんどは自分の方でエラーが。
でも解決出来るだろうとゴニョゴニョ始める。

## 2500

反省タイム。
サルでもわかるgitのページで、
時間をかけてでも学ぶ事にする。
慌てちゃダメ、だね。

## 2530

落ち着いても、ダメなものはダメ。
なにか残念な事に一筋縄では行かない状況に陥ってたらしく、pullしてもpushしても、ファイルを消してみても復活続き。
ちょうどそこでお隣でもgitトラブル発生中。トラブル解決していた進撃の方が居たので、便乗させてもらってしまった。
超親切に色々教えてもらい、goroさんといい、仮面の人といい、みんなに感謝しっぱなし。
次回出れたら手助け出来る側になろうと心に思う。
とりあえず…

・gitは最後はコマンド覚えおくと良い
・コミット→pull→エラーが起きたら差分で解決→push の流れが鉄板。
・それでダメならバックアップとってからクリーンナップのhardでスッキリ
・それでもダメならリビジョン戻しを。

ということを覚えた。

## 2600

やっと開発に戻れる。
声塊は飛ぶようになったので、
t君は背景の改良を始める。
ここでgoroさんが見に来てくれて、水面proオススメ。とアドバイスを…

そしてそこから、水面見てたら夕陽なんか良さそうじゃない？
と自然と話題が盛り上がりアセットストアでサンセット探し。

ここから夕陽に向かって叫ぶゲームへと方針が固まり始める！

でもスカイボックスだと立体にならないから工夫が必要とアドバイスをもらい板に太陽に吠える感じの夕日を貼り付けてみる。
想像以上にいい感じに… 
これは叫びたくなる青春の馬鹿野郎。

…ー

ここよりシーンの共有についてお隣のカッパさんよりアドバイス。
同じシーン、一緒にいじるな、自分用作るべし、コミットしなくてもいいじゃない、共有するならプレファブ化
という呪文を授かった。

## 2700(0300)

睡魔〜に襲われつつコエカタマリン。
誤変換がいい感じ。
時々背後の揺れるマトリョーシカとファルコンが存在感を放つ深夜、ヤッホイヤッホイと音声認識テスト。
t君は文字の挙動の調整や寿命管理など微調整。だんだん良い感じに。

## 0330

t君とセブイレブンに買い出しに。
眠けをお菓子で解決を図る。

## 0400

ここから自分はマルチ対応を試みる。
色々聞いて見てphoton cloudを使う事に。
photon cloudの人が居るとの事で、早速聞きに行って期間限定100人までのgamejamクーポンを貰い、やり方聞いたり参考資料教えてもらって、開発開始！

## 0500

概念の理解が中々進まずunityとの繋がりをサンプル動かしつつ試しつつ。
そこにgoroさんが見に来てくれたので聞いてみる。すると、あそこに居る人が書いたという2時間で作れちゃうハーレム 
 <リンク>
を教えてもらう。
バイキングデモ、これはイイモノ。

## 0530

眠いx2

マルチの対応を細かく始める。
t君にインスタンス間通信のやり方聞きつつunity初心者丸出しで悩みながら。でも…
イマイチ、SendMessage()で通信がしっくり来ない。
何というかレガシーだなぁ…と。
メタ情報とかリフレクションとか…

と悩んで引数2つの関数とかどうやって渡すのだろと、unity仮面団の方に聞いてみたら…

GetComponent！

これだ！求めてたモノは！
ありがとう！

というわけでt君にc#のセカイを教えて使い方とかを共有。
goroさんによると昔はSendMessage使ったサンプル多かったとの話をきく。

ラムダ式で匿名メソッド、varによる型推論、これでこそc#
と、テンション上がる。

## 0600

t君撃沈。
自分も時々意識が夢の中。

## 0630

マルチ対応にメド立つ感じ。
photon cloudのサンプルのスクリプトを貼り付けマッチング処理がサクサク作れる。
楽すぎる…リモートプロシージャコールもすぐ出来たし…悩んだ所はUnityの文化まわりが主な所。

unityの感覚を掴み始めた気がし始める。ヤッター！タツジンっ！

…で、まだまだ初心者だった事をこの直後に体験するわけだけど、この時の自分は知る由も…(略

t君は復活して夕日の調整を。
そこでお隣のグラフィックの人、カッパさんにアドバイスを貰い、そしてモデルを作ってもらう事に！

人数は2人だけど実は結構みんなに支えられてたりするコエカタマリン。

## 0700

…何故か自分用のシーンだと少しすると声塊が生成されなくなる…
なんでェ…
見比べても違いないし…
追加したのはマルチ周り…
もしや此奴か！と一個一個消したり付けたり始めるもサッパリ。

## 0800

t君順調。
砂浜調整とか文字の向きとかカラー調整の準備とか。

自分不調、どうしてもわからない…
なにやら開始後、一定期間経つと作ったインスタンスの型が変わるらしい。
unity仮面に聞いてみたけど挙動からみて違う型を使ってるとしか思えない、との事…

## 0900

t君順調
ここよりキャラクターに手を出す事に。

自分不調。
全くわからず…シンボル名と関数名が被ってる…これか！ いや違うみたい…と繰り返し。
ヤバイ！時間が…湯水の如く…

## 1200

t君キャラクターで悩み中。
メカニムメカニム。

自分解決！
マルチも何も関係無かった！
シーン内に声塊のインスタンスが入ってたので何気無く生成元プレファブとしてドラックしちゃったのが敗因。

敗因1.シーン内のインスタンスは、プレファブ化する前の名残りでゴミだった。
このインスタンスはスクリプトが働いてるので一定時間で消えるので、
ゴミに気づく事はなしだった。

敗因2.このインスタンスを生成元に割り当てたりなんかすると当然、途中で消える

敗因3.マルチ周りを組み込む前、シーンをコピペって追加して行った時、テスト実行してなかった。
コピペ程度だと慢心した為発見遅れる。
単体でテスト、gamejamでも重要なのかも

敗因4.プレファブを理解するべし！
50のtipsというサイトを斜め読みした時にしつこいくらい注意書きがあったのに…
手を動かしながら覚えておくべきだった。

6時間無駄になっちゃった…
(・ω≦) ﾃﾍﾍﾟﾛ

## 1300

マルチ対応、発射位置の共有はサクッと完了。
自分にはローカルで、相手にはリモートで届くRPCはかなり便利ね。

t君はキャラ周りで苦戦中。
メカニム難しいみたい。

あと5時間…
ここで残作業整理。
ここまで対戦要素も考えて来たけど、ざっくりカット。
叫ぶだけでも楽しい！よね？

## 1500

キャラは目処が立ってきたみたい。

自分はビッグな懸念事項だった、定期的に音声認識処理が止まる対策を。
自動再開しようにも、毎回マイクの許可のメッセージが出てしまう。
そこでまずは
・nodejsをhttpsに変更
・websocketのプロトコルをwws://のアドレスに変更。
これさえ出来れば、
あとは音声認識の終了イベントが来たら再度開始する処理を記述するだけ。
辿り着くまでに時間がかかったけど実装はアッサリと。

## 1600

t君にトラブル発生！ プロジェクトのマージの時にうっかり、ハードにクリーンナップしてキャラ周りが消えてしまったらしい…
あ、t君のやる気ゲージが目に見えて下がってる…
とりあえず、また作り直しをお願いし、
こちらは突貫でキャラの同期の実装を開始する…

※今思うとトータスgitなら消したファイルはゴミ箱に入ってたりして…

## 1700

終了のお知らせが！
キャラとキャラのマルチは諦める事になった…二人共心残りを残しながら後始末にかかる。

## after1700

ニコ生発表会の後、
みんなで、打ち上げ！

部屋の中心に鎮座する、

天 河 を 駆 る フ ァ ル コ ン

やはり威容と存在感がすごい。

周りでミクだよーさんや、VRのセカイへ旅立った2人組、宙を翔けるWiiボードなどが並ぶ中、結構地味なコエカタマリ。

でも、突貫で入れたマルチ要素のおかげで結構楽しんでもらえたみたい。
100人で出来たらカオスだろうなぁ…

そんなこんなで猛烈に面白かった
第1回OGJJの、
コエカタマリチームのhの視点より、チラシの裏的レポートでした！

## 以上当時のレポートです
- 一年前の心残りがちょっとは解消できた！よし、睡眠時間的にとても重大なことをしでかしてるけど、明日(今日だ)のOculusGameJamガンバロー