【Unity】ARKitを使用して平面にオブジェクトを置く方法
UnityでARKitを使用した平面認識、認識した平面に3Dオブジェクトを出力する方法をご紹介します。
ARKitとはApple社が提供するARライブラリで、iOS向けのAR機能を提供しています。
ARKitを利用することで誰でも簡単にAR機能を実装することができます。
ARを利用するためのライブラリは他にもARCoreやVuforiaなどがあります。
© UTJ/UCL
ARKitの準備
Unityについて
はじめにARKitをUnityで利用するための準備方法をご紹介します。
Unityとはゲーム開発を行うための機能をひと通り搭載したゲームエンジンです。
ここではある程度Unityの使い方を理解している前提で話を進めます。
Unityを利用したことがないという方は以下記事を参考にしてUnityの環境構築・基本的な使い方をキャッチアップしてください。
参考記事)Unityの環境構築方法
参考記事)Unityの基本的な使用方法まとめ
ARKitをダウンロード・インポートする
まずは以下リンクからUnity-ARKit-Pluginをダウンロードします。
ダウンロードが完了したらUnityにインポートします。
Unity-ARKit-PluginはAssets下にありますので、そちらをUnityプロジェクト側のAssets下にコピーします。
Unity-ARKit-PluginフォルダをそのままUnityのプロジェクトウィンドウのAssetsにドラッグ&ドロップします。
プロジェクトウィンドウが以下のようになっていれば問題ありません。
これでUnityでARKitを使用する準備が整いました。
ARKitを使用する
ではここからARKitを利用していきます。
ARKitを最低限使用するために、以下3つのクラスを利用します。
- UnityARVideo.cs
- UnityARCameraNearFar.cs
- UnityARCameraManager.cs
これら3つのそれぞれの役割についてはここでは省略しますが、この3つを利用することで現実空間とAR空間の連携を行うことができます。
この3つの使い方について解説していきます。
まずはじめにUnityARVideo.csとUnityARCameraNearFar.csをメインカメラにアタッチします。
この2つはどちらもUnityARKitPlugin→Plugins→iOS→UnityARKit→Helpersフォルダの中にあります。
以下のようにメインカメラにドラッグ&ドロップすることでアタッチできます。
次にアタッチしたUnityARVideo.csにYUVMaterialをアタッチします。
UnityARKitPlugin→Plugins→iOS→UnityARKit→Materialsフォルダの中のYUVMaterialをUnityARVideo.csのClearMaterialにドラッグ&ドロップしてアタッチしてください。
次にUnityARCameraManager.csを利用します。
このスクリプトはメインカメラに取り付けても問題ありませんが、ここでは機能をわかりやすくするために空のオブジェクトを作成してそちらにアタッチします。
↓空のオブジェクトを作成して名前を「UnityARCameraManager」とする。
作成したオブジェクトにUnityARCameraManager.csを先ほどと同じようにアタッチします。
UnityARCameraManager.csはUnityARKitPlugin→Plugins→iOS→UnityARKit→Helpersフォルダの中にあります。
アタッチしたら、ヒエラルキーウィンドウのUnityARCameraManagerオブジェクトを選択、アタッチされたスクリプトのCameraにMainCameraをドラッグ&ドロップしてアタッチしてください。
これで最低限の準備が完了しました。
※注意
MainCameraのClearFlagsをDepthOnlyにしないと正しく出力されませんのでご注意ください。
平面を認識してオブジェクトを生成する
ここから平面を認識してオブジェクトを生成するスクリプトを作成していきます。
生成したいオブジェクトは任意ですが、ここではUnityChan(ユニティちゃん)を使用します。
© Unity Technologies Japan/UCL
使用したいオブジェクトの準備が完了したら、新しいスクリプトを作成します。
名前は任意ですが、ここでは「UnityChanCreater」とします。
作成したスクリプトを以下のように編集してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.iOS; public class UnityChanCreater : MonoBehaviour { //インスペクターウィンドウでUnityChanをセット public GameObject unityChan; //オブジェクトの出力回数を制限したいときに使用 bool isCreated = false; //オブジェクト(UnityChan)を生成するためのメソッド void CreateObject(ARPoint point) { //平面との接触情報をリスト化 List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface() .HitTest(point, ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent); // 平面とあたっていた場合 if (hitResults.Count > 0 && !isCreated) { //UnityChanを生成 GameObject ucObject = Instantiate(unityChan); //AR空間での座標を生成したUnityChanに適用する ucObject.transform.position = UnityARMatrixOps.GetPosition(hitResults[0].worldTransform); ucObject.transform.rotation = UnityARMatrixOps.GetRotation(hitResults[0].worldTransform); //オブジェクト生成回数を1回にしたいとき以下を有効にする //isCreated = true; } } // Update is called once per frame void Update() { //タップがあった場合 if (Input.touchCount > 0) { var touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began) { //タップ情報を元にAR空間での点に変換する var screenPos = Camera.main.ScreenToViewportPoint(touch.position); ARPoint point = new ARPoint { x = screenPos.x, y = screenPos.y }; // タップされた位置を引数にCreateObjectを呼ぶ CreateObject(point); } } } } |
スクリプトの解説はスクリプト内にコメントしておりますのでそちらをご参考ください。
次にスクリプトをアタッチします。
空のオブジェクトを作成してください。名前は任意ですが、ここでは「ARController」として作成します。
作成したら、先ほど作成したスクリプトをアタッチしてください。
アタッチするとインスペクターウィンドウが以下のようになりますので、赤枠部分に任意のプレハブをアタッチしてください。
ここではUnityChanのプレハブをアタッチします。
これで全ての準備が整いました。
では実際に実行してみましょう。
※実機での実装方法は以下をご参考ください。
参考記事)iPhoneでの実装方法
※Unityちゃんを使用する場合はサイズが大きすぎるのでお好きなサイズに調整してからご使用ください。
↓実行結果
タップした場所にUnityChanを出力することができました。
正常にオブジェクトが出現しないとき
オブジェクトがうまく出力されない場合は以下のような変更をして、うまく出力されるか確認してください。
- メインカメラをタグ付けする(「MainCamera」タグにする)
- Flare Layerをメインカメラに取り付ける(AddComponent→Rendering→FlareLayer)
- UnityARCameraManagerのPlaneDetectionを「Horizontal and Vertical」に変更する
※スクリプトに記述ミスがある可能性もありますので、再度確認してください。
まとめ
いかがでしたでしょうか。
今回はARKitを使用して平面に任意のオブジェクトを配置する方法をご紹介してきました。
ARKitを利用すれば簡単にARを開発できることがおわかりいただけたのではないでしょうか。
今後もARKitの開発方法をご紹介していきたいと思いますのでぜひご参考ください。
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!