【Unity】ARKitを使用して平面にオブジェクトを置く方法


UnityでARKitを使用した平面認識、認識した平面に3Dオブジェクトを出力する方法をご紹介します。

ARKitとはApple社が提供するARライブラリで、iOS向けのAR機能を提供しています。

ARKitを利用することで誰でも簡単にAR機能を実装することができます。

ARを利用するためのライブラリは他にもARCoreやVuforiaなどがあります。

ARkitロゴ

© UTJ/UCL

ARKitの準備

Unityについて

はじめにARKitをUnityで利用するための準備方法をご紹介します。

Unityとはゲーム開発を行うための機能をひと通り搭載したゲームエンジンです。

ここではある程度Unityの使い方を理解している前提で話を進めます。

Unityを利用したことがないという方は以下記事を参考にしてUnityの環境構築・基本的な使い方をキャッチアップしてください。

参考記事)Unityの環境構築方法

参考記事)Unityの基本的な使用方法まとめ

ARKitをダウンロード・インポートする

まずは以下リンクからUnity-ARKit-Pluginをダウンロードします。

ARKit2forUnityダウンロードページ

Unity-ARKit-Pluginダウンロードページ

ダウンロードが完了したらUnityにインポートします。

Unity-ARKit-PluginはAssets下にありますので、そちらをUnityプロジェクト側のAssets下にコピーします。

Unity-ARKit-PluginフォルダをそのままUnityのプロジェクトウィンドウのAssetsにドラッグ&ドロップします。

プロジェクトウィンドウが以下のようになっていれば問題ありません。

ARKitインポート後のプロジェクトウィンドウ

これで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アタッチ

次にアタッチしたUnityARVideo.csにYUVMaterialをアタッチします。

UnityARKitPlugin→Plugins→iOS→UnityARKit→Materialsフォルダの中のYUVMaterialをUnityARVideo.csのClearMaterialにドラッグ&ドロップしてアタッチしてください。

YUVMaterialアタッチ

次にUnityARCameraManager.csを利用します。

このスクリプトはメインカメラに取り付けても問題ありませんが、ここでは機能をわかりやすくするために空のオブジェクトを作成してそちらにアタッチします。

↓空のオブジェクトを作成して名前を「UnityARCameraManager」とする。

UnityARCameraManager

作成したオブジェクトにUnityARCameraManager.csを先ほどと同じようにアタッチします。

UnityARCameraManager.csはUnityARKitPlugin→Plugins→iOS→UnityARKit→Helpersフォルダの中にあります。

アタッチしたら、ヒエラルキーウィンドウのUnityARCameraManagerオブジェクトを選択、アタッチされたスクリプトのCameraにMainCameraをドラッグ&ドロップしてアタッチしてください。

MainCameraアタッチ

これで最低限の準備が完了しました。

※注意

MainCameraのClearFlagsをDepthOnlyにしないと正しく出力されませんのでご注意ください。

DepthOnly

平面を認識してオブジェクトを生成する

ここから平面を認識してオブジェクトを生成するスクリプトを作成していきます。

生成したいオブジェクトは任意ですが、ここではUnityChan(ユニティちゃん)を使用します。

© Unity Technologies Japan/UCL

使用したいオブジェクトの準備が完了したら、新しいスクリプトを作成します。

名前は任意ですが、ここでは「UnityChanCreater」とします。

作成したスクリプトを以下のように編集してください。

スクリプトの解説はスクリプト内にコメントしておりますのでそちらをご参考ください。

次にスクリプトをアタッチします。

空のオブジェクトを作成してください。名前は任意ですが、ここでは「ARController」として作成します。

作成したら、先ほど作成したスクリプトをアタッチしてください。

アタッチするとインスペクターウィンドウが以下のようになりますので、赤枠部分に任意のプレハブをアタッチしてください。

ここではUnityChanのプレハブをアタッチします。

UnityChanアタッチ

これで全ての準備が整いました。

では実際に実行してみましょう。

※実機での実装方法は以下をご参考ください。

参考記事)iPhoneでの実装方法

※Unityちゃんを使用する場合はサイズが大きすぎるのでお好きなサイズに調整してからご使用ください。

↓実行結果

ARKit実行結果

タップした場所にUnityChanを出力することができました。

正常にオブジェクトが出現しないとき

オブジェクトがうまく出力されない場合は以下のような変更をして、うまく出力されるか確認してください。

  • メインカメラをタグ付けする(「MainCamera」タグにする)
  • Flare Layerをメインカメラに取り付ける(AddComponent→Rendering→FlareLayer)
  • UnityARCameraManagerのPlaneDetectionを「Horizontal and Vertical」に変更する

※スクリプトに記述ミスがある可能性もありますので、再度確認してください。

まとめ

いかがでしたでしょうか。

今回はARKitを使用して平面に任意のオブジェクトを配置する方法をご紹介してきました。

ARKitを利用すれば簡単にARを開発できることがおわかりいただけたのではないでしょうか。

今後もARKitの開発方法をご紹介していきたいと思いますのでぜひご参考ください。


ARkitロゴ

この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!

株式会社x gardenのLead Engineer。

バックエンドからフロントエンドまでフルスタックで開発しています。

最近Twitterはじめました @FuruiYuya