剣を自在に振ってスライムを倒すHoloQuestを作ってみた【HoloLens+ARKit】
今回作ったもの
今回HoloQuestという、HoloLensとiPhoneを使った簡単なアクションゲームを作成しました。
HoloLensを通してiPhoneの位置にARの武器が表示され、その剣を使って敵モンスターを倒すゲームです。
youtu.be
現実でドラクエがやりたすぎてHoloQuestというゲームを作った。HoloLensを被って剣(iPhone)を振ってスライムを倒すゲーム。#HoloLens #HoloQuest pic.twitter.com/3z1pGDYU62
— これち (@Korechi_) 2017年10月1日
動機
- 現実空間でスライムと戦ってみたかった(重要)
- HoloLens と ARKit を組み合わせればこんなものが作れるよというのを見せたかった・試したかった
使用した機材
- HoloLens
- HoloQuestが動作
- iPhoneの位置に剣を表示
- スライムの表示なども行う
- HoloQuestが動作
- iPhone6s(iOS11)
- HoloControllerアプリが動作
- ARKitを使い自身のpositionとrotationを取得
- 自身のpositionとrotationをHoloLensに送信
- コントローラーとして使用
- HoloControllerアプリが動作
開発環境
- Unity 2017.1.1f1
- HoloQuestとHoloClientの実装
- Visual Studio 2017
- HoloQuestアプリのビルドに使用
お借りした素材
剣
スライム
実装
剣をiPhoneの位置に表示
どうやって剣をiPhoneの位置に追従させて表示させるかのイメージ図がこちら。
それではiPhone側で動作するHoloClientアプリと、HoloLens側で動作するHoloQuestの実装それぞれについて説明します。
HoloClient(iPhone側)の実装
iPhone側で動作するアプリは非常に単純で、必要とした機能は以下の2つです。
1. AR Kitを動作させ常に自身のpositionとrotationを取得
2. 自身のpositionとrotationをHoloLensに毎フレーム送信
この際には凹みさんのuOSCを使用させていただきました。
github.com
3. マーカーを画面に表示
自身の位置をHoloLensに知ってもらうために表示しています。マーカーは何でも良いです。
HoloLens側ではvuforiaというマーカー認識ソフトを使用します。
HoloQuest(HoloLens側)の実装
HoloLensとiPhoneはそれぞれが別のアプリが動作しており、どちらのアプリもアプリが起動した瞬間の自分(カメラ)の位置を(0, 0, 0)としてスタートします。
そのため、HoloLensから見てiPhoneがどこに存在するかの相対位置は分かりません。
そこで2通りの位置合わせ方法を今回使用しました。
①HoloControllerアプリをHoloLensの指定された位置で起動
手順は以下の通りです。
1. HoloQuestが起動した時にHoloLensの前に剣を表示
- 今回は(2,0,2)に表示
2. iPhoneをその剣に重ねた状態でHoloClientアプリを起動
- HoloLensからした(2,0,2)の位置がiPhoneにとっては(0,0,0)だと認識される
3. iPhoneから受信したpositionである(x,y,z)に(2,0,2)を足した場所に剣を表示し続ける
②vuforiaを使い、iPhone上に表示されたマーカーを認識して剣の位置を再調整
しかし、iPhoneを振り続けていると剣とiPhoneの位置がだんだんとずれていってしまいます。(原因はまだわかっていません)
そこでゲームのプレイ中に位置がずれたなーと思った時にiPhoneの位置を再調整するためにvuforiaというマーカー認識ソフトを使いました。
vuforiaの参考記事はこちら。
vuforiaではマーカーを認識している間、マーカーのpositionとrotationを取得することができます。
その機能を利用し、剣がずれたなーと思った時にHoloLensの前にiPhoneを持ち上げマーカーを認識させるとiPhoneの位置が再度取得できます。
スライムとの戦闘
これは単純にスライムオブジェクトと剣オブジェクトにcolliderを設定し、OnCollisionEnter()で衝突を検知します。
OnCollisionEnter (Collider collider) { if (collider.gameObject.tag == “Army”) { this.hitPoint -= 1; } }
気をつけたUI
プレイヤーは敵モンスターをどこから見るか分かりません。
後ろから見た時にモンスターの後ろ姿が見えるのは問題ないのですが、HPは常にプレイヤーの方向を向くように設定しました。
今回やらなかったこと
床・壁・天井に別テクスチャを貼る
床を芝生にしたり天井を空っぽく見せることでゲーム空間っぽい演出をしようかなーと思ったのですが今回はしませんでした。
参考記事
http://www.naturalsoftware.jp/entry/2016/06/14/110111www.naturalsoftware.jp
理由は2つあり、1つは処理が重くなる。もう1つは視野角が狭いため敵モンスターを見ていると周りの風景があまり見えないから。
ここらへんは改善の余地ありかもしれません。
最後に
HoloLens + ARKitでゲームを作ってみましたがとても相性が良かったように思えます。
両者ともセンサーを必要としないため、どんなに歩いても問題ありません。(非常にでかい)
しかし、どうしても両者の相対位置はずれてきてしまいます。
実用面で考えるならば、新しいコードレスコントローラが発売されるか、vuforia以外のもっと良い位置合わせ方法が求められると思います。
HoloQuestを実際にリリースすることはありませんが、HoloLens + ARKitは面白い組み合わせですし、可能性があると思うので、みなさまも是非お試し下さい!