凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

第2回おうちハック勉強会でキーノートトークしてきた

はじめに

本日、GARAGE秋葉原で行われた「おうちハック勉強会 #2」に参加して、キーノートトークで発表してきました。

みなさん各々作られたとても濃いものを発表されていて面白かったです。私は今まで作ってきたものの紹介と、その反省点や考察、それを踏まえて今月作ってみたものの紹介をしてきました。本エントリでは、その資料と、これまでとの差分の部分について書きます。

資料

内容について

過去のブログ記事についての詳細は以下になります。

サーバのコードはこちらです。

今回の差分としては「誤動作」と「即時性」の改善で、Android Wear を使った半自動化をしてみたのと、まとめて色々な機器を操作できる無線スイッチを作ってみました。

Android Wear との連携による半自動化

これまでは、自動化することで思わぬ動作をしてしまうことが多々ありました。例えば GPS 情報のノイズで家からいないことになり電気が消えたり、何も動いてないのに廊下の電気がついたり、寝る前に Google カレンダーに登録していた自動おやすみスケジュールが発火されて全部の電気やモニタが消えたりといった感じです。これを改善するために、いったんアクションを行うかどうか Android Wear へ通知し、違うアクションもできるよう選択肢を与えたり、登録されていないアクションは音声認識で行えるようにしました。

サーバ側で解釈したイベントに応じた情報(タイトルや背景画像、API の URL 等)を JSON につめて GCM 経由で Android へ通知し、NotificationCompat.WearableExtender にその情報をつめてレイアウトしてアクションを実行できるようにしています。

f:id:hecomi:20150202003541p:plain

動画ではトリガとして、ミクミンPさんのエントリで紹介されている TWE-Lite x リードスイッチによる開閉センサを玄関に設置して利用しています。

これによってドアを開けた瞬間にほぼ瞬時に情報が飛んでくるようになりました(GCM からの遅延がなければ)。Android Wear 通知用のコードはまだ整理してないですが以下になります。

ぶっちゃけ帰ってきた / でかけるタイミングでないと Android Wear をつけていないので、PC やその他の機器にも同じように通知が来てアクション出来るようにしようと思います。

無線スイッチの作成

同じく TWE-Lite を使って無線スイッチも作ってみました。

f:id:hecomi:20150131172340j:plain

ちょっとまだ見た目がアレな感じですが、ベッド脇には全ての電気・モニタを消したり部屋の電気をつけれるスイッチを、パソコンの前にはデュアルモニタの ON/OFF が出来るスイッチを、玄関には全ての家電をオフにしたり帰ってきた時に一連の電気やモニタをつけるスイッチをとりつけています。地味ですがかなり便利です。やっぱりスイッチは間違うことのない安心感があってイイですね。

両方共まだ作ったばかりで実際に生活してどうなのかというところは、また追々ご報告できればと思います。

おわりに

みなさんの LT がとてもおもしろくて刺激を受けました。Slack で色々垂れ流すのは便利そうなので真似してみようと思います。あと物理的に動くものがあると良いので今年は何か作りたいです。

おうちハックは色々な技能が身について、実際に生活も便利になったり面白くなったりして、かつ共有もしやすいとても面白いテーマだと思うので、継続して色々とやっていきたいと思います。

最後になりましたが、素晴らしい会を開催してくださった大和田さん、湯村さん、ありがとうございました!

Maya LT 2015 の勉強始めました

はじめに

Maya LT の勉強を始めました。以前、Blender でキャラクターモデリングに挑戦したことはあったのですが、それっきりになっていて、再度モデリングやアニメーションを始めようと思ったのですが、今は低価格版の Maya LT が利用できることから、Blender でなく Maya LT をやってみようと思った次第です(お金払うと払ってるお金をムダにしないようにやらないと...ドリブンで頑張る気もするので)。

まずは最初に勉強を始めたとっかかりや、Unity へのエクスポートを試してみたことなどをメモしておきます。

Maya LT の概要

Maya は Autodesk 社による高機能なモデリングやビジュアルエフェクト、アニメーション、レンダリングといった機能を包括的に扱うプロ用の CG ツールで、¥550,800 もします(買えない)。

Maya LT はそんな Maya の低価格版のサブセットになります。

特殊なエフェクトや物理演算など使えない機能もありますが、モデリングしたりアニメーション作って Unity 等のゲームエンジン側へエクスポートする作業を行う分には特に困ることはなさそうです。

Maya LT の入手

レンタルライセンスと永久ライセンスがあります。レンタルライセンスは期間によって値段が異なり、オンラインストアからは1ヶ月または1年を選ぶことができ、それぞれ ¥4,320 と ¥35,640(¥2,970/月)です。永久ライセンスは ¥119,880 です。ちょっと触って見る分にはレンタルライセンスはとても入りやすい価格だと思います。月間だと Steam 版が ¥4,000 でお得のようです。

また、15日間のトライアルライセンスも用意されているので、まずはじめにこちらでお試しするのも良いと思います。

Getting Started / チュートリアル

  • Help
    • Maya LT のヘルプ(F1 キーで開く)
    • Maya LT 2015 の新機能を含む機能についての説明が記載されています
    • こちらを眺めるより初心者は下記チュートリアルをやるほうが分かりやすいです
    • チュートリアルをやって分からないことがあったらここで検索、という流れが良いと思います
  • Maya スタートアップ ガイド
    • Maya に初めて触れる人のために用意されたチュートリアル
    • 図もついていてとても丁寧で分かりやすいです
    • 分量も多いので、本を買わなくてもまずここから始めれば良さそう
  • Maya Tutorials | Maya | Autodesk Knowledge Network
    • 上記チュートリアルの各レッスンに必要なファイルが置いてあります(英語)
    • "Getting Started with Maya 2015 Lesson Files (zip - 123Mb)" がそれに当たります

チュートリアルをやってみた

Maya の基本

「Maya の基本」の章をやってみると、基本的なユーザインターフェースや操作が把握できると思います。所要時間は Twitter 見ながらだらだらやって 2 時間ほどでした。書いてあるとおりに進めていって、忘れた用語などがあれば適宜ググる、みたいな形で、特に困らずに進められると思います。

f:id:hecomi:20150118162428p:plain

アニメーション

レッスン 1 とレッスン 3 だけやってみました。キーフレームアニメーションを触ったことがあれば1時間ほどで出来ると思います。

Unity へモデルをエクスポート

Unity は .mb(Maya Binary)形式のインポートをサポートしているのですが、Maya LT では .mb で保存することが出来ません。

そこで、FBX にエクスポートするか「Unity に送信」機能のどちらかを使います。

FBX にエクスポート

「ファイル > すべて書き出し」または「ファイル > 選択項目の書き出し」で FBX でファイルをエクスポート出来ます。この FBX を Unity の Project ビューにドラッグ&ドロップしてあげれば OK です。

なお、チュートリアル中で利用した NURBS(Non-Uniform Rational Basis Spline)で作られた曲面はそのままではエクスポートしても何も表示されないので、変換するオプションをチェックする必要があります。これについては以下のサイトに詳しく説明されています。

取り込んでみると以下のようになります。

f:id:hecomi:20150118170406p:plain

Unity に送信

「ファイル > Unity に送信」で直接 Unity の Assets ディレクトリに FBX を保存することが出来ます。まず、Unity のプロジェクトのディレクトリを選択し、そこの Assets ディレクトリ下に保存するファイル名を指定して保存します。その後、Unity 側のウィンドウをアクティブにすればその FBX がロードされ使えるようになります(Unity はウィンドウがアクティブになった時に Assets 下のファイルをインポートするため)。オプションなどは前述のエクスポートと同じです。

f:id:hecomi:20150118170649p:plain

結果は先ほどと同じですが、こちらの方がインポートの手間が省けて楽です。

FBX 出力と「Unity に送信」の違い

こちらのリストに書いてありますが、通常の FBX 出力では 65,000 ポリゴンまでの制限があります。しかしながら、「Unity に送信」機能を用いると、ポリゴン数の制限がなくなります。特に理由がなければ後者を使うのが良さそうです。

アニメーションのインポートもやってみた

ピンポンの方(レッスン 1)は特に何も困らずに、インポートしたらアニメーションがついてきたので、Animator を作成して、アニメーションを追加するだけで再生出来ました。

f:id:hecomi:20150118202104p:plain

飛行機のパスアニメーション(レッスン2)の方はアニメーションが含まれていなかったのですが、「アニメーションをベイク処理」にチェックを入れると、正常にアニメーションをエクスポート出来ました。

f:id:hecomi:20150118205815p:plain

f:id:hecomi:20150118200633p:plain

ちょっとした動き程度であれば Unity 側でアニメーションを作ってもいいかもしれません(やることは同じなので好みで)。

おわりに

Blender との比較ですが未だ触り始めなので良くわかりません...。あちらは .blend ファイルを直接 Unity が読み込めますが、こちらも送信機能があるのでそんなに困らなそうです。

結局はツールよりもセンスだと思うので、多分私程度だとどちら使っても変わらない気がします...。

取り敢えずプリミティブを使ったアニメーションくらいなら出来るようになりましたが、まだキャラクタ周りやエフェクトと覚えることがたくさんありそうなので、地道に頑張ろうと思います。

Unity WebGL x WebSocket でみんなで自由にブロックを置いて遊べるブラウザゲームを作ってみた

はじめに

Unity WebGL x WebSocket でたくさんのオブジェクトを同期する前回の仕組みを利用して、データの永続化の実験をしてみました。

デモ

マイクラもどきです。全員がログアウトしてもデータをサーバに保持しておくようにしました。みなさんのご協力のお陰で面白い空間ができたと思います!ありがとうございます。

よくよく考えると別に WebGL ビルドしなくてもデスクトップアプリとしても動くので同時に配布しました。WebGL だとやっぱり表現力が弱いので見た目はデスクトップアプリのほうが綺麗ですね。

ブロックの数が現状かなり多いので重くて動かない可能性もありますがご了承下さい。

コード

コードは前回と同じ場所にプロジェクト一式あげてあります。

仕組み

f:id:hecomi:20150112160844p:plain

基本的には前回と同じ仕組ですが、isSavedToServer フラグの立ったオブジェクトに紐付いたコンポーネントはサーバ側に永続化されるようにしました。例えば保存されているファイルは以下の様な感じです。

これを各クライアントのログイン時に送って復元しています。後は前回と同じようにログインしている各クライアントのローカルな情報を随時サーバ経由でブロードキャストします。

反省

バグをいくつか出しながらも、みなさんのご協力のお陰で何とか遊べるレベルにはなったのではないかと思います。

ただ、オブジェクトはいくらでも置けるようにした結果、現在保存されているデータは 31000 行くらいあり、ブロックに1つにつき位置情報を保存するコンポーネントと色情報を保存するコンポーネントがついているので、合計で 15000 個くらいのブロックが置かれていることになります。ご体験いただいた or お察しの通りめちゃくちゃ重いです。

この後、renderer.material.color にアクセスするとマテリアルのコピーが走るのでキャッシュしてダイナミックバッチングが効くように、とか色々調整してちょっとは軽くなりましたが、それでもまだ重くてしんどいです。ブロックは Particle System で描いてコライダだけ GameObject にするとか、何か色々と工夫しないと厳しそうな感じがしますが、これだけ大量のオブジェクトを同期するのは特殊ケースだと思うのと、このゲームのためだけに最適化しても微妙な気がするので次に移ろうと思います。

おわりに

今回は実験も兼ねていたので、どれくらい行けるか制限を設けずにやってみましたが、思っていたよりはうまく動いたと思います。次は AI をどう動かすかの実験か、WebSocket x サーバデータ保持に代わる WebRTC x LocalStorage の実験をしてみようと思います。