【Unity】ARFoundation入門~機能解説から平面検知の実装まで~
IT技術
ARFoundationとは?
今回は、Unity を使った AR 開発の導入部分について、解説していきたいと思います!
ARFoundation とは、Unity が開発している、AR 開発用のフレームワークです。
イメージ的には、iOS と Android で別々の実装をしなくてもいい、というとても便利なもの。
iOS でビルドするときは ARKit で、Android でビルドするときは ARCore で動作するようにしてくれます。
では早速、見ていきましょう!
ARFoundationの導入
まずは、ARFoundation を使用するためのセットアップをしていきましょう!
ここでは、「Unity2019.4.9f1」「iOS ビルド環境」で進めていきます。
ビルド環境は、Android でも操作に違いはありません。
プラグインのインストール
3D プロジェクトを立ち上げて、必要なプラグインをインストールしていきます。
「Window → Package Manager」から進めていきましょう!
次に、Package Manager ウィンドウから、以下の3つをインストールしていきます。
- ARFoundation
- ARkit XR Plugin
- ARCore XR Plugin
ARFoundation をインストールすると、必要なプラグインが、同時にインストールされます。
ARkit と ARCore は、必要に応じて、どちらか片方でも構いません。
( ARkit は iOS、ARCore は Android )
シーンのセットアップ
次に、シーン内のセットアップをしていきましょう!
まずは、デフォルトで Hierarchy に入っている、Main Camera を削除します。
今、Hierarchy には、Directional Light だけがある状態です。
次に、「AR Session」と「AR Session Origin」を加えます。
手順は、まず Hierarchy 上で右クリック して、「XR → AR Session、AR Session Origin」と進みます。
これで、ARFoundation で開発するための準備が完了しました!
AR SessionとAR Session Origin
先ほど追加した2つの項目は、AR 開発において欠かせないものです。
では、この2つについて、簡単に説明していきます。
ARSession
AR シーンには、ARSession コンポーネントを含める必要があります。
ARSession は、AR のライフサイクルを制御するコンポーネントです。
Session は、AR 環境の「プロセス」という意味もあり、AR シーンのプロセスの管理をすると言った方が、イメージしやすいかもしれません。
ARSession Origin
ARSesion Origin も、AR シーンには欠かせないコンポーネントです。
デバイスを通して、読み込まれた現実空間の情報は、Session Space で管理されます。
Session Space の情報を、Unityシーンの「位置・方向・スケール」に変換するのが、ARSession Origin です。
また、現実空間では、シーンが開始されたときのデバイスの位置が座標の原点となります。
ですが、Unity シーンでは、ARSession Origin が原点となるのです。
デフォルトで、「ARCamera」が子オブジェクトに含まれていて、それが AR アプリでのカメラになります。
人によるかと思いますが、この ARCamera のタグを、MainCamera に変えておくと便利かもしれません。
平面検知を実装しよう!
セットアップが終わったら、現実空間の平面を検知して、そこにオブジェクトを配置してみましょう!
今回は、タップした平面上の位置に、オブジェクトを配置するようにしていきます。
オブジェクトは、お好みで作ってもらって構いませんが、ここでは赤いキューブを使用します。
使用するオブジェクトは、Prefab を作成し、Hierarchy からは削除しておいてください。
また、オブジェクトを作る際は大きさに注意してください。
Unity シーンでの1ユニットは現実空間では1メートルになります。
ARPlane ManagerとARRaycast Managerの追加
Unity で、平面検知をするのに、コードを書く必要はありません。
ARPlane Maneger コンポーネントを、ARSession Origin に加えるだけで、自動的に平面検知を行ってくれます。
今回は、Raycast を使用するので、ARRaycast Manager コンポーネントも必要になります。
それでは、ARPlane Manager と、ARRaycast Manager を加えていきましょう。
- ARSessionOrigin を選択
- Add Component
- AR で検索
- ARPlane Manager, ARRaycast Manager
の順に進めていきます。
ARPlane Maneger コンポーネントを見ると、ARPlane Prefab の項目が空になっています。
ARPlane は、検知した平面を、デバイス上で可視化するのに必要なものです。
次は、これを作って、ARPlane Manager にアタッチしましょう。
まず、Hierarchy 上で右クリックをして「XR → AR Default Plane」の順に進めていきます。
AR Default Plane のプレハブ化は、ARPlane Manager の ARPlane Prefab の項目にアタッチします。
ここまでできたら、平面が検知され、画面上に表示されるようになります。
スクリプトの作成
検知された平面に、オブジェクトを配置するコードを書いていきましょう!
ここでは、「SpawnManager」という名前のスクリプトを、以下のように作成しました。
1using System.Collections.Generic;
2using UnityEngine;
3
4//ARFoundationを使用する際に追加するネームスペース
5using UnityEngine.XR.ARFoundation;
6using UnityEngine.XR.ARSubsystems;
7
8public class SpawnManager : MonoBehaviour
9{
10 [SerializeField] GameObject redCube;//生成するオブジェクト
11 private ARRaycastManager arRaycastManager;
12 private List<ARRaycastHit> hits = new List<ARRaycastHit>();
13
14
15 void Start()
16 {
17 arRaycastManager = GetComponent<ARRaycastManager>();
18 }
19
20 void Update()
21 {
22 if(Input.touchCount > 0)
23 {
24 Touch touch = Input.GetTouch(0);
25 if(touch.phase == TouchPhase.Began) //画面に指が触れた時に処理する
26 {
27 if (arRaycastManager.Raycast(touch.position, hits, TrackableType.PlaneWithinPolygon))
28 {
29 Pose hitPose = hits[0].pose; //RayとARPlaneが衝突しところのPose
30 Instantiate(redCube, hitPose.position, hitPose.rotation); //オブジェクトの生成
31 }
32 }
33 }
34 }
35
36
37}
タッチした場所に、すぐにオブジェクトが生成され、そこから動くことがないようなコードが書いてあります。
ですが、Touch.phase によって処理を変えると、オブジェクトの生成の仕方を変えることもできます。
AR シーンで、Raycast を使用するときは、Physics.Raycast ではなく ARRaycastManager.Raycast を使用する点に注意してください。
また、Raycast の最後の引数にある TrackableType は、XR でデバイスが追跡可能なオブジェクトのタイプを指定します。
このスクリプトでは、ポリゴンを用いて、平面と Ray の衝突を追跡するようになっています。
コードを書き終えたら、シーンに戻って、できたスクリプトを ARSession Origin に追加しましょう。
そしたら、RedCube の項目に、作っておいたプレハブをアタッチしてください。
Build Settingを変更する
最後に、Build Setting を変更していきましょう。
この章では、iOS と Android に分けて、説明していきます。
以下は、ProjectSettings の Player 項目の内容です。
iOSの場合
まずは、Other Setting を開き、以下の順で進めていきましょう。
- Require ARKit Support にチェック
- Target minimum iOS Version を、11以上に変更
- Architecture を ARM64 に変更
Require ARKit Support にチェックを入れると、Camera Usage Description に、自動でコメントが追加されます。
Androidの場合
Android の場合は、まず Other Setting を開き、Minimum API Level を7.0以上に変更してください。
次に、Graphics APIs から Vulkan を削除します。
以上で、セッティングは完了となります!
実機で確認してみよう!
Build Setting まで終わったら、ビルドをして、実機で動かしてみてください。
以下のような動きがみられれば、成功です!
さいごに
今回は、ARFoundation 入門として、機能解説から平面検知の実装までを紹介していきました。
思っていたほど、むずかしくはなかったのではないでしょうか?
では今回も、最後まで読んでいただきありがとうございました!
この記事が、ARFundation を使ってみようという方にとって、少しでもお役に立てれば嬉しいです!
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit