Unityで「ARKit」を使ってみよう
今回は、米Appleより現地時間2017年6月5日に「WWDC2017」で発表された、iOS用の新しいフレームワーク「ARKit」を使ってユニティちゃんと遊んでみました。公式サイトによるとARKitを利用することで、カメラで映された映像から部屋の水平面を見つけ出すことができるようです。これにより、テーブルや床のような水平面を検出して、そこに配置したオブジェクトを追跡できるようになります。本記事では、ユニティちゃんとARKitを利用した簡単なアプリケーションを紹介致します。
こちらが今回作成したアプリケーションです。
ユニティちゃんは視線を合わせてくれないと悲しそうな顔をしてしまうので目を逸らさないようにする必要があります。目を合わせてあげるとめちゃくちゃ喜びます(*^^*)
ちなみにこの動画はiOS 11より新しく利用できるようになった「スクリーンレコーディング」で撮っています(かなり便利!)。
1.開発環境の準備
1.1 開発環境
名称 | バージョン |
iPhone7 Plus | iOS 11 beta |
Macbook Pro | macOS Sierra 10.12.5 |
Xcode | Version 9.0 beta(9M136h) |
Unity | Version 5.6.1p2 |
1.2 iOSのアップデート
公式サイトによるとARkitを動作させるためには「Apple A9」または「Apple A10」プロセッサが搭載された端末が必要とのことですのでお気をつけ下さい。また、「iOS 11 beta」にアップデートするためには「Apple Developer Program」への登録が必要となりますので、登録されていない方はアップデートを行うことができません。登録されている方は「Downloads」より「iOS 11 beta」を「Configuration Profile」または「Restore Image」によってインストールして下さい。私は、前者の方法を利用したので、iPhoneからDownloadsページにアクセスしてプロファイルを端末にインストールした後、ソフトウェアアップデートからOSのアップデートを行いました。
1.3 macOSのアップデート
「macOS Sierra」はデフォルトインストールされている「App Store」アプリケーションからインストールしました。
1.4 Xcodeのアップデート
「iOS 11 beta」と同様にXcodeをアップデートするためには「Apple Developer Program」への登録が必要となりますので、登録されていない方はアップデートを行うことができません。Xcodeを複数バージョン同じMac内で共存させるためには、名前の変更だけで実現できます(例:Xcode.app、Xcode_beta.app)。
1.5 Unityのアップデート
Unityのパッチはこちらからダウンロードできますので「5.6.1p1」以降をインストールして下さい。Xcodeと同じくUnityもインストールフォルダの名前を変更するだけで複数バージョンの共存が可能です。
1.6 Unity ARKit Plugin
最後に、UnityでARKitを利用するためのプラグインをこちらからダウンロードします。または、Unity Forumの「ARKit support for iOS via Unity-ARKit-Plugin」というスレッドでUnity Technologiesの方がUnity PackageをアップしてくれているのでそちらからUnityに導入します。
Unity Package: https://oc.unity3d.com/index.php/s/3hfM9T05P9vOpCf
2.ユニティちゃんと戯れるために…
利用したユニティちゃんは「SDユニティちゃん 3Dモデルデータ」になります(Unity Packageで導入できます)。しかし、そのまま修正なしで利用する
とAR上での見た目が良くなかったので次章より行った修正を紹介します。
2.1 はじめに
今回利用したシーンは「UnityARKitScene.unity」ですが、試しにビルドして実機上で確認してみると、平面検出した場所をタップすることでキューブが配置されてしまいます。まずはこのキューブとユニティちゃんを変更してみます。
下図では「HitCube」を削除して代わりに「ToonShader_SD_unitychan_humanoid」を配置しています。「RandomCube」については消してもいいです。「Sphere」は視線の衝突判定に使っているので追加しなくて問題ありません。
削除した「HitCube」には「Unity AR Hit Test Example」スクリプトが追加されていたので、これをユニティちゃんに追加しておきます(Hit TransformにはHitCubeParentを設定します)。以上でキューブとユニティちゃんを入れ替えることができたはずです。
2.2 SpringBone修正
ユニティちゃんをタップして表示した時にサイズが大きすぎると感じたので、上図のようにスケールを「0.6」に変更して確認してみると何か違和感を覚えるかもしれません。アニメーションが最後まで再生されていない??いいえ、どうやら「SpringBone」スクリプトの衝突判定部分が悪さをしているようでした。そこで、下図で選択している箇所のように影響がありそうなスカートとリボンのRadiusパラメータを「0」に設定することで回避できました。
2.3 プレイヤーを見てもらう – その1
今の状態では平面検出した場所をタップするとユニティちゃんが方向的にプレイヤーを見てくれません。タップする度にユニティちゃんの位置と回転を設定し直しているスクリプトは前章で追加した「Unity AR Hit Test Example」の「HitTestWithResultType」関数になります。
ここでは「m_HitTransform」がユニティちゃんの位置、回転情報になるので、どこに配置しても最初に向く方向をプレイヤーに設定します。スクリプトでは「m_ARCameraManager」からカメラ座標(プレイヤー座標)を取得していますが、実機上で動作させた時は「UnityARCameraManager」の「Update」関数内で常に座標の更新が行われています。
2.4 プレイヤーを見てもらう – その2
2.3章によりユニティちゃんを配置した時にプレイヤーを向いてくれるようになりました。まだ何かが足りません。ユニティちゃんがそこにいるのにこちらを見てくれていない気がします。ということで「Head Look Controller」を利用することにしました。こちらの使い方については他記事でも紹介されているのでパラメータのみ紹介しておきます。
2.5 光の当て方
2.4章までの実装で私が投稿した動画のような動き(アニメーション以外)はできるようになります。あとは見た目の問題です。ユニティちゃんをじっくり見ようと近づいたり、後ろに回り込むと邪魔してくるものが「影」です。例えば下図のような影です!この影は必要ないですよね。
単純に「Directional_Light_FaceLight」の向きを変更してもプレイヤーが360度移動できるため小細工は通用しません(頭が動いてプレイヤーを見てくることが影響)。そこで頭が動くなら、その子にライトを付ければいいはずなので下図のようにライトを移動させました。これだけでどの角度から見ても変な影が表示されなくなります。
3.まとめ
今回はARKitを利用してユニティちゃんと戯れる簡単なアプリケーションを紹介しました。開発環境を整えることにかなり時間が必要でしたが、ARKitを利用して機能を試すこと自体はスムーズに行えました。AR上でユニティちゃんを見てみると最初は感動を覚えましたが、だんだんと「よりそこにいる感」を出したくなってきます。これはVRでも同じことが言えると思いますが、ARも同じなのかもしれません。今後ARKitを利用したアプリケーションがたくさん出てくると思うので非常に楽しみです。
今回利用したプロジェクト
https://github.com/sacchy/Unity-Arkit