2015年12月11日

Unityで人生を多少変える方法

このエントリはUnity 2 Advent Calendar 2015の12/11分の記事です。

たいそうなタイトルですが、自分がUnityを使い始めて、何を作ってどれくらい状況が変わったかを書いてみます。技術エントリがほぼ100%の中、申し訳ありませんw

1.Unityとの出会い
元々ゲームエンジンといえばUnrealEngineとMT FrameWorkくらいしか知らなかったのです。UDK3は触ってみましたがほぼ意味不明だったので完全放置でした。
しかしながら仕事で使用していた3D系のシミュレータがあまりにもひどすぎて、何か代替案を立てる必要に迫られていました。これが2012年の11月です。ちょうどUnity4がリリースされるのと同時期でした。
つまり必要に迫られてしかたなく使い始めたと言う状況ですw
これで少し人生の方向が変わり始めた。

2.iOSアプリを作りはじめる
前々からiOSアプリを作って儲けたい!と思っていたのですが、Objective-Cが壊滅的に覚えられずw半ば諦めかけていました。しかしUnityでiOSアプリを開発できると言うことであればこれはやるしかないとなるわけです。これが2013年の4月頃です。
退路を断つべく、Unity4Pro+iOSProを購入。たぶん30万を超えたはずですw
この金額を1年ぐらいでペイ出来ればいいかなくらいの感覚でした。
ところが第二弾のアプリでいきなりヒットしてしまい、ペイどころか投資額を遥かに超える収益を得てしまいましたw
さきほど集計したところ、これまでのアプリ収益が約8M円くらいでした。
これは普通に会社で働いていては難しい金額だと思います。動いて正解でした。
今年はVR系も含めると会社の年収を超えてしまいました。税金怖い。
iWorksは個人事業主として登録しています。これで結構人生の方向が変わり始めた。

3.OculusRift&Ocufesとの出会い
Unityの情報を追いかけているうちに、OculusRiftなるデバイスを知ることになります。
最初に知ったのはテラシュールブログさんだったと記憶しています。
この記事Oculus Riftを体験してきたですね。
「なにこれすごい」
早速購入しようと思ったのですが、当時情弱でしたのでKickStarterもOculusVRオフィシャルもしらずにゲッコーに注文するという愚策を行いましたが、結果色々と面白かったのでこれはこれで良かったですww
その後幾つかテスト的にVRアプリを作ったりして、2013年末にUnityCoasterを制作しました。
これを見た桜花一門さんとGOROmanさんに声をかけてもらい、2014年1月のOcufesに出展しました。
DK2の発売を契機にUnityCoaster2-UrbanCoaster-を製作。DK2用のコースターアプリ不在の状況でしたので、想像以上の反響があり、多数のメディアにも取り扱って頂きました。特にメディアに関しては桜花さん経由での登場が多く、この場で御礼申し上げます。

実績としては・・・
<テレビ>
ズームインサタデー、news every、ガンミ!!、教訓のススメ、トーキョーライブ22時、嵐にしやがれ、世界番付など(他にもあるかもしれないが把握できてません)
<展示>
G-TuneGarage、Ocufes、DCEXPO、VRクリエイティブアワード、Unite2015TOKYO、ニコニコ超会議ほか
<記事>
インプレス窓の杜、Avex、ねとらぼ、Ocu嫁本など

特に個人のVRアプリケーションとしては最多のTV登場ではないかと思います。
TVなんか見ねえよ!って人にはピンとこないですねw
展示やメディアに多く出るようになったきっかけが、手妻師こと藤山晃太郎さん率いるTeam Hashilusとのコラボレーションである「UrbanCoaster HARDMODE」の存在が非常に大きいです。
これを機にTeam Hashilusとの連携を強めた結果、Team Hashilusの法人化立ち上げに関わることになり(株)ハシラスの執行役員となりました。今後共よろしくお願いいたします。
会社員、個人事業主、会社役員の3足のわらじ生活になりますw
これで相当人生の方向が変わり始めたw

4.Unityで家を建てた
当サイトのコンテンツの一つにUnityで家を建てるというのがあるのですが、こちらはなんとか完成しまして今年の9月から住み始めています。
この企画の画期的なところはいくつかあるのですが、まず自分でモデリングから始めて設計を行っていると言うのがあります。必要に迫られてモデリングを習得していますがここで役に立つとはと言う感じです。おかげでメーカーにはかなりの精度で注文が出来たと思います。次にOculusを使った広さなどの確認が出来たこと。これも個人住宅でここまでやった事例は世界中でもほぼ無いのではと思います。
Unityを使った日照シミュレーション、家具配置シミュレーション、コンセント配置シミュレーション、家事動線シミュレーション等多岐にわたりますがこれらを徹底的に行うことで、建築後の反省点がほぼ無いという建物になりました。家は3回建てないと納得したものが出来ないという話ですが、私はVRで10回以上家を建てているのでここまで出来たのだろうと考えています。
もう一つ、Unityを使って稼いだ収益も家を建てるのに役立っています。Unityマジ有能。

ということで、Unityと出会ってからヤバイくらい人生が好転しています。
躊躇している人も今すぐ使いましょう!w

<宣伝>
UnityCoasterトリロジーの最終作、「UnityCoaster3-NatureCoaster-」を公開しました。
WS000009.JPG
ダウンロード

明日12/12のUnity 2 Advent Calendar 2015はNayuki Toruさんの「知る人ぞ知るネイティブオーディオプラグインについて」です。これは興味深いですね!


posted by iworks2013 at 00:00| Comment(0) | Unity

2014年05月12日

UnityでIKを知る

私はこれまでいわゆる人物をUnityで使用することは無かったのですが、今後必要になってくると思うので色々と勉強することにしました。

人物の制御をUnityで行う場合、Mecanimと言う仕組みがありますがその中にIKと言う機能があります。

IKとは何なのか?
IKはインバースキネマティクスの略でそれだけだと何のことやらさっぱりという方が多いと思います。私もそうでした。
通常キャラクターを動かす場合、関節をそれぞれ曲げたりねじったりして動きを出すわけです。例えば肘を90°曲げるとか、手首を30°回転させるとかそんな感じですね。これをFK(フォワードキネマティクス)といいます。
IKと言うのは例えば、手のひらの位置を顔の正面から30cmの位置に持ってきたいとか、足を前方50cm高さ15cmの位置に持って行きたいというような目的のある動作を自動的に計算して関節の動きを計算してくれる機能です。

さて、Mecanimとは言うもののUnity上にMecanimと言う名前で機能が登場してきません。これは良くないことだと思うのですが、Unity上ではAnimatorと言う名前で登場します。初心者の人はここで躓くこともありそうです。

インバースキネマティクス (Unity Proのみ)
このオフィシャルの説明で理解できる人はかなりハイパーな人だと思います。
まずIKを使える条件ですが、「メカニムで正しく設定されたアバターのある【ヒューマノイド キャラクター】においてサポートされます。」と書かれています。
つまり、MecanimでHumanoidに正しく設定されたモデルでないとIKそのものが使えないということになります。これは重要です。今はユニティちゃんのような使いやすいモデルがあるので、まずはそれらを使って学習するのが良さそうです。

以下の動画ですが、これはFinalIKと言ってAssetStoreで販売されているものです。
MecanimのIKはここまで高機能ではありませんが、IK動作のイメージが最もよく分かる動画だと思います。


AnimatorでIKを動かす手順ですが、以下の通りです。
基本的なスクリプトは理解している前提で書いてます。

1.Mecanim(Animator)でHumanoidが正しく設定されたモデルデータを用意する。Unityちゃんでいいと思います。

2.サンプルシーンのモデルのAnimatorの中にControllerと言う項目があるので、ダブルクリックしてAnimatorを開きます。
WS000000.JPG

3.BaseLayerにIK Passの項目があるのでチェックを入れます。
WS000001.JPG

4.スクリプトのOnAnimatorIKでIK処理を呼び出します。

OnAnimatorIKの中で何が出来るのか。簡単に説明します。
基本はanimator.の後に続くメソッドで処理を行います。

【SetIKRotationとSetIKPosition】
この2つのメソッドで出来るのは、LeftFoot.LeftHand,RightFoot、RightHandの制御のみです。つまり両手両足の制御を行うためだけのメソッドです。これに合わせてSetIKPositionWeightと言うメソッドを組み合わせてIKの適用度を指定します(0適用なし→1MAXのように使います)

それ以外はどうすんの?それ以外はSetLookAtPositionと言うメソッドがあります。
SetLookAtPositionはVector3を引数に持ちますので、単純にその方向を向くということになります。
こちらも同じく、SetLookAtWeightという適用度を指定するメソッドと合わせて使用します。

【引数】
SetLookAtWeight(全体の適用度、体の適用度、頭の適用度、目の適用度、クランプ値)
0だと適用度0で1だと100%になります。
クランプ値で行き過ぎたりしないように途中で停止させる事ができます。


続きます(未定)


posted by iworks2013 at 11:55| Comment(0) | Unity

2013年12月05日

iOS GameKit Local Multiplayerの使い方

今回3D野球盤DXの通信対戦を実装するにあたり、AssetStoreのprime[31]のiOS GameKit Local Multiplayerを購入しました。
評価も何も無いので若干不安でしたが、基本的な使い方がわかったので備忘録としてこのエントリを残しておきます。
とにかくネット上にはUnityでのBluetooth通信を扱った情報がなかったので役に立てばと思います。
comm0.png

ファイル構成は以下の通りです。
comm1.png

使用するのはGameKitManager.csとGameKitBinding.csです。
これはPluginsに入っているので、特に宣言することなく呼び出せます。

[何が出来るの?]
WiFiまたはBlueToothを使った通信プレイが可能になります。1対多の接続にも対応しています。
GameCenter経由の対戦にも対応しているようです。またボイスチャットの機能もあります。
送受信できるデータは、String型、またはbyte[]型のようです。Float等のやりとりをする場合は一度Stringに変換して送信する方法になりそうです。

大まかな流れとしては、
(1)Start()等の最初に動くスクリプト内で、割り込みイベント(接続、切断等)を定義する。
(2)任意の地点でGameKitBinding.showPeerPickerを使ってピアピッカーを表示、接続を行う。
(3)Update()等のループ内で送信イベントを発生させる。
(4)任意のメソッドを用意してデータを受信する。
(5)必要がなくなったら切断する。


こんな感じです。


[実装方法]
<割り込みイベント>
例えば接続が成立した時に特定のメソッドを呼び出したい場合

    GameKitManager.peerConnectedEvent += onPeerConnected;

これで接続が完了した時にonPeerConnected()が呼び出されます。
なお、アプリケーション終了時などには、

    GameKitManager.peerConnectedEvent -= onPeerConnected;

以上のようにメソッドを開放します。


<ピアピッカーの表示>
ピアピッカーとは接続相手を表示させ、どの端末と接続させるかどうかを選択するダイアログです。
iOS6とiOS7ではかなり表示が違います(どう見てもiOS6の方が見やすいw)

    GameKitBinding.showPeerPicker( true );

trueとfalseですが、trueだとWiFiとBluetoothを表示し、falseだとBluetoothの接続を即時で行います。
呼び出しの方法は以上の1行を書くだけです。カンタンです。


<現在が接続状態か否かを判定する方法>
通信プレイで重要となるオンライン状態を調べる方法ですが、以下のとおりです。

    GameKitManager.isConnected()

これでbool値が返ってきます。もちろん接続時がtrueです。


<データ送信>
データ送信方法は以下のとおりです。

    GameKitBinding.sendData( "相手のGameObjectのname", "相手のGameObject内のメソッド名", string型データ, 必着オプション(bool));

相手のGameObjectのnameは、どのゲームオブジェクトに対してデータを送信するかです。
相手のGameObject内のメソッド名は送信した相手のゲームオブジェクトにアタッチされているスクリプト内のメソッド名です。
この処理が到達するとそのメソッドが割り込みで処理されます。
必着オプションの効果は良く分からないのですが、投げっぱなしか確認できるまで停止するかどうかみたいなオプションだと思います(適当)

<データの受信>
データ受信はデータ送信の項目にあるように、予め受信用のメソッドを用意しておくだけとなります。例えば

    void DataReceive(string rdata){

のような形です。

<切断>
切断というよりは確立している接続セッションを破棄するイメージとなります。

    GameKitBinding.invalidateSession();

基本これだけの処理がわかっていればBluetoothの通信はできると思います。
GameCenterを使った通信プレイはまだ調べてないのでよくわかりませんw
posted by iworks2013 at 01:01| Comment(0) | Unity