#はじめに
ARFoundationを使って、平面にARオブジェクトを配置するスタンダードなアプリを作ります。
オブジェクトのデバック用に使うことも多いので備忘録として残しておきます。
初学者にも分かり易いようなUnity×ARのHelloWorld的記事に仕上げましたので、
手を動かしながら作ってみるといいかもです。
#環境
MacBook Pro : Catalina 10.15.5
Unity : 2019.4.0f1
Xcode : 11.5
iPhone 11Pro : 13.5.1
#ARプロジェクトの準備
###Packageのインストール
ファイルメニューのWindow > Package Managerから以下の2つをインポートします。
・AR Foundation(4.0.2)
・ARKit XR Plugin(4.0.1)
※「AR」で検索すると見つかりやすいです。
###AR Session Origin、 AR Sessionコンポーネントの配置
Hierarchyウインドウで右クリックし、以下の2つを追加します。
・XR -> AR Session
・XR -> AR Session Origin
※Packageが正しくインストールされていると「XR」の項目が追加されています。
###Main Cameraの削除
ARプロジェクトではAR Camera
を利用するのでMain Camera
は削除しておきます。
##検出した平面の可視化
AR Plane Manager.cs
というスクリプトを使用して、検出した平面を可視化させます。
不必要な場合はこのセクションを飛ばしてしまっても問題ありません。
###AR Default PlaneのPrefab化
もう一度Hierarchyウインドウで右クリックし、AR Default Plane
を追加します。
・XR -> AR Default Plane
追加したらAR Default Plane
をPrefab化してHierarchyからは削除します。
###AR Plane Managerをアタッチ
Hierarchyに配置済みのAR Session Origin
にAR Plane Manager.cs
をアタッチします。
InspectorのPlane Prefab
には、先ほどPrefab化したAR Default Plane
をアタッチしましょう。
Detection Modeを変更することで、水平や垂直のみを検出するように変更が可能です。
##タップ位置にARオブジェクトを配置する
AR Placement Manager.cs
というスクリプトを作成し、タップした位置にrayを照射して、平面にぶつかった場合のみARオブジェクトを配置します。
今回はAsset Storeからインポートした、ロボットをARで出現させます。
###ロボットのインポート
下記URLからロボットをインポートします。
Add to My Assets
→ Open in Unity
ボタンとクリックすると、「Unityを開きますか?」とポップアップが出現するので許可をします。
https://assetstore.unity.com/packages/3d/characters/robots/space-robot-kyle-4696
UnityのPackage Managerに飛ぶのでインポートをクリックします。
ProjectのAssets直下にRobot Kyle
が追加されていれば大丈夫です。
###シーンにロボットを追加
Assets -> Robot Kyle -> Model -> Robot Kyleをシーンにドラッグアンドドロップします。
シーンに追加されたRobot Kyle
はInspectorからチェックを外し、非アクティブにしておきましょう。
また、Animationも利用しないためチェックを外しておきます。
※ARで表示させたいオブジェクトが大きすぎると、モデルの内側にカメラが埋まってしまい、モデルを確認できない場合があります。必要に応じてScaleを変更しておきましょう。
今回は(0.1, 0.1, 0.1)に変更します。
###AR Placement Managerの作成
ARオブジェクトの配置を管理するAR Placement Manager.cs
を作成します。
Project内で右クリック、Create -> C# Script で名前はARPlacementManager
にしてください。
スクリプトは以下のようにします。
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.XR.ARFoundation;
//ゲームオブジェクトにアタッチすると、ARRaycastManager.csを必要な依存関係として自動的に加える。
[RequireComponent(typeof(ARRaycastManager))]
public class ARPlacementManager : MonoBehaviour
{
[SerializeField]
GameObject arObject; //ARで表示するオブジェクト
[SerializeField]
private GameObject arCamera; //ARで利用するカメラ
ARRaycastManager raycastManager;
List<ARRaycastHit> hitResults = new List<ARRaycastHit>();
void Awake()
{
//RequireComponentで追加されたARRaycastManager.csを代入する。
raycastManager = GetComponent<ARRaycastManager>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//rayを照射して平面に当たっていた場合。
if (raycastManager.Raycast(Input.GetTouch(0).position, hitResults))
{
//arObjectが非アクティブの場合、アクティブにする。
if (arObject.activeSelf == false)
{
arObject.SetActive(true);
}
//キャラクターがarカメラを向く。
arObject.transform.position = hitResults[0].pose.position;
Quaternion lookRotation = Quaternion.LookRotation(arCamera.transform.position - arObject.transform.position, Vector3.up);
lookRotation.z = 0;
lookRotation.x = 0;
arObject.transform.rotation = Quaternion.Lerp(arObject.transform.rotation, lookRotation, 1);
}
else
{
return;
}
}
}
}
作成したスクリプトは、Assets直下にScripts
フォルダ作って管理すると良さそうです。
###AR Placement Managerのアタッチ
AR Session Origin
に、作成したAR Plane Manager.cs
をアタッチします。
InspectorのAr Object
、Ar Camera
にはHierarchyに配置済みのRobot kyle
とAR Camera
をアタッチします。
#Project Settings
###カメラの利用許可
カメラの利用を許可しないと、ビルド後にiPhoneのカメラが使えません。
Xcodeでも記述できますが、Unity側で設定してしまいましょう。
ファイルメニューのEdit -> Project Settingsを選択し、Project Settings
を開きます。
Player -> Configuration -> Camera Usage Discriptionにテキストを記入することで、カメラの利用許可を求められるようになります。
###XR Plug-in Management
ARFoundation4.0からPlug-in Providers
の設定が必要になりました。
XR -> XR Plug-in Management -> Plug-in Providers -> ARKitにチェックを入れましょう。
#Build
ファイルメニューのEdit -> Build Settingsを選択し、Add Open Scenes
をクリックして作成したシーンをScenes In Build
に追加します。
今回はiPhoneで動かしたいのでPlatform
をiOS
にしてSwith Platform
します。
※結構時間かかります。
Swith Platform
が終了したらBuild
しましょう。Unityでの作業は以上になります。