UnityとRailsで初音ミクMMDモデルを使った3Dアクションクイズゲーム「ミクミク走ってＱ！」を作ってみた

# URL
■サービスURL
http://mikumikuplay.com/quiz/

■紹介動画URL
http://www.nicovideo.jp/watch/sm23275229

# 概要
「ミクミク走ってＱ！」はブラウザで簡単に遊べる3Dアクションクイズゲームです。ゲームのルールは簡単で、クイズの問題が表示されて、回答の壁に向かって走るというものです。

# 特徴
1. MMDモデルの初音ミクが走ってクイズの回答をする3Dアクションクイズゲーム
2. ユーザーがWebサイトからクイズの問題を投稿することができる
3. Webブラウザのみ、ユーザー登録なしでプレイ可能
4. 開発作業を生放送で配信して視聴者から貰った意見を反映
5. Unity4, MikuMikuDance, MikuMikuDance for Unity, Ruby2.1, Ruby on rails4, MongoDB, MySQL等の技術によりUnityとWebを連携したシステムを構築

# 利用技術
APサーバ: Apache, Passenger
DB: MongoDB, MySQL
クライアント技術(Unity): Unity4, MikuMikuDance for Unity, JSON Object,
クライアント技術(Web): JQuery, Twitter Bootstrap
サーバー技術:Ruby2.1, Ruby On Rails4 リバースプロキシ nginx
3Dモデル	あにまさ式ミク, MMDオークランド

詳細は、http://mikumikuplay.com/quiz/page/thanks に書いてます。

# これらの技術を使ってみての感想

## Unityは慣れると生産性高い
3Dゲームの開発は初めてだったのですが、Unityを使うことによって3Dゲームを簡単に作ることが出来ました。
Unityの開発手順は
1. GUIの操作で3Dオブジェクトを配置してパラメータを設定する
2. スクリプトを書いてオブジェクトに張り付ける
というものです。
初めの内は、戸惑ったのですが、慣れたらサクサク進むようになりました。

スクリプトのフィールドをpublicにするとUnityのGUIからパラメータを設定することが出来ます。ゲームの実行中にもUnityのGUIからパラメータをセットして、セットした値の挙動をその場で確認することが出来ます。これはすごく便利でパラメータの調整の度にコードを書き替えてゲームを再起動という作業が不要になります。

## MikuMikuDance for Unityありがたい
UnityではMikuMikuDance for Unityというツールを使うことによってMikuMikuDanceのモデルを使用することが出来ます。このツールのおかげでMikuMikuDanceの豊富なモデルを活用することが出来ました。

## UnityでMMDモデル使うのに役立った記事
↓このブログのおかげでこのゲームを作れたといっても過言ではないくらい助けられました。
MMD for Unityでミクさんとケロリン町を周るお話 その1
http://eral.blog.eonet.jp/default/2013/10/mmd-for-unity-1-a42b.html
MMD for Unityの使い方から、MMDモデルで動き回るところまで手順が詳細に書かれていて、手順通りにやったら出来ました。
こういう記事って超ありがたいです！

## C#は静的型言語でありながら簡潔に書ける構文があって良い
例えば、型推論。
var s = "aaaaaaaaa";
って書くと、右辺の値を見てstring型だとコンパイラは判断してくれて型安全になる。
あとプロパティの構文があって
public string Name { get; set}
って書くとNameのゲッターセッターが生成されます。Javaみたく自分でgetNameとか書かなくていいのでコードが短くなります。JavaでもIDEがアクセサを生成してくれるから書く手間はないけど、コードが長くなるってことがあると思います。

C#はメソッド名がパスカル記法なのがなかなか慣れなくてキャメルケースで書いてしまう時がよくありました。

## MonoDevelopよりVisual Studioを使うべし
MonoDevelopだと日本語入力しずらかったり、補完もいまいちだったりなので、UnityからVisual Studioを起動できるように設定しました。

Visual Studioは評判いいみたいですが、まだ慣れないせいかEclipceの方がコード支援が充実してるように感じました。でもMonoDevelopよりは断然VSの方がいいです！

## Rubyはインストール関連で躓いたけど、言語としてはすごく良い
構文が簡潔というのは良いということを改めて感じた。
単純な話で関数を
function hoge() {
}
って書くのと
def hoge
end
だと後者の方が断然楽で、書くのが楽だと精神的にもdefって書くだけだから、関数に切り出しておこうっていう気持ちが湧きやすく、その結果、きれいなコードになりやすいう気がします。書いていて、ほんとに構文に無駄がなくて気持ちよく感じました！

Rubyというとブロック渡し、Enumelableとかのイメージがあってそれらを使ってこそのRubyだという印象だったのですが、実際使ってみるとブロック渡しはもちろん便利で素晴らしいですが、大半のコードはそれらを使うわけではなく、やはり、無駄のない構文こそがRubyの一番の良さなのだと思いました。

## Ruby On Railsは導入でつまずいたけど、慣れたらサクサク進んだ
「Railsは実は簡単なフレームワークではない」とよく言われているけれど、実際使ってみたところ、たしかにその通りだと感じました。が、慣れたらサクサク進むようになったので、その閾値を超えるまで頑張るのが大事だと思いました。
最初はSinartaとかシンプルなFWを使った方がいいって意見はもっともだと思います。
次Ruby使う時はSinartaやPadrinoを使ってみようと思ってます。

# ニコ生しながら開発するとペアプログラミングみたくなるからありがたい！
開発作業はニコニコ生放送で配信していました。すると視聴者の方がゲームの機能やデザインについてのアイデアをコメントしてくれました。それらを積極的に取り入れて開発を行いました。

そんなわけで良かったらプレイしてみてください！
http://mikumikuplay.com/quiz/

<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="top"><div style="border:1px solid;margin:0px;padding:6px 0px;width:320px;text-align:center;float:left"><a href="http://hb.afl.rakuten.co.jp/hgc/02b75513.56077fcc.04549cd7.9cd6da87/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f12720545%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16882369%2f" target="_blank"><img src="http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f1049%2f9784798041049.jpg%3f_ex%3d300x300&amp;m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fbook%2fcabinet%2f1049%2f9784798041049.jpg%3f_ex%3d80x80" alt="【楽天ブックスなら送料無料】Unity実践技術大全 [ 菊田剛 ]" border="0" style="margin:0px;padding:0px"></a><p style="font-size:12px;line-height:1.4em;text-align:left;margin:0px;padding:2px 6px"><a href="http://hb.afl.rakuten.co.jp/hgc/02b75513.56077fcc.04549cd7.9cd6da87/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fbook%2f12720545%2f%3fscid%3daf_link_tbl&amp;m=http%3a%2f%2fm.rakuten.co.jp%2fbook%2fi%2f16882369%2f" target="_blank">【楽天ブックスなら送料無料】Unity実践技術大全 [ 菊田剛 ]</a><br><span style="">価格：3,996円（税込、送料込）</span><br></p></div></td></tr></table>