25
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Unity】ARFoundationを使ってオブジェクトを配置する

Last updated at Posted at 2020-07-08

#はじめに
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」で検索すると見つかりやすいです。
スクリーンショット 2020-06-30 2.47.43.png

###AR Session Origin、 AR Sessionコンポーネントの配置
Hierarchyウインドウで右クリックし、以下の2つを追加します。
・XR -> AR Session
・XR -> AR Session Origin
※Packageが正しくインストールされていると「XR」の項目が追加されています。

###Main Cameraの削除
ARプロジェクトではAR Cameraを利用するのでMain Cameraは削除しておきます。
スクリーンショット 2020-06-30 3.05.06.png

##検出した平面の可視化
AR Plane Manager.csというスクリプトを使用して、検出した平面を可視化させます。
不必要な場合はこのセクションを飛ばしてしまっても問題ありません。

###AR Default PlaneのPrefab化
もう一度Hierarchyウインドウで右クリックし、AR Default Planeを追加します。
・XR -> AR Default Plane

追加したらAR Default PlaneをPrefab化してHierarchyからは削除します。
スクリーンショット 2020-06-30 3.49.52.png

###AR Plane Managerをアタッチ
Hierarchyに配置済みのAR Session OriginAR Plane Manager.csをアタッチします。
InspectorのPlane Prefabには、先ほどPrefab化したAR Default Planeをアタッチしましょう。
Detection Modeを変更することで、水平や垂直のみを検出するように変更が可能です。
スクリーンショット 2020-06-30 4.19.23.png

##タップ位置にARオブジェクトを配置する
AR Placement Manager.csというスクリプトを作成し、タップした位置にrayを照射して、平面にぶつかった場合のみARオブジェクトを配置します。
今回はAsset Storeからインポートした、ロボットをARで出現させます。

###ロボットのインポート
下記URLからロボットをインポートします。
Add to My AssetsOpen 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)に変更します。
スクリーンショット 2020-06-30 20.21.47.png

###AR Placement Managerの作成
ARオブジェクトの配置を管理するAR Placement Manager.csを作成します。
Project内で右クリック、Create -> C# Script で名前はARPlacementManagerにしてください。
スクリプトは以下のようにします。

ARPlacementManager.cs
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フォルダ作って管理すると良さそうです。
スクリーンショット 2020-06-30 21.21.04.png

###AR Placement Managerのアタッチ
AR Session Originに、作成したAR Plane Manager.csをアタッチします。
InspectorのAr ObjectAr CameraにはHierarchyに配置済みのRobot kyleAR Cameraをアタッチします。
スクリーンショット 2020-06-30 21.37.14.png

#Project Settings

###カメラの利用許可
カメラの利用を許可しないと、ビルド後にiPhoneのカメラが使えません。
Xcodeでも記述できますが、Unity側で設定してしまいましょう。

ファイルメニューのEdit -> Project Settingsを選択し、Project Settingsを開きます。
Player -> Configuration -> Camera Usage Discriptionにテキストを記入することで、カメラの利用許可を求められるようになります。
スクリーンショット 2020-06-30 22.00.10.png

###XR Plug-in Management
ARFoundation4.0からPlug-in Providersの設定が必要になりました。
XR -> XR Plug-in Management -> Plug-in Providers -> ARKitにチェックを入れましょう。
スクリーンショット 2020-07-05 19.54.48.png

#Build
ファイルメニューのEdit -> Build Settingsを選択し、Add Open Scenesをクリックして作成したシーンをScenes In Buildに追加します。
今回はiPhoneで動かしたいのでPlatformiOSにしてSwith Platformします。
※結構時間かかります。
スクリーンショット 2020-06-30 22.12.05.png
Swith Platformが終了したらBuildしましょう。Unityでの作業は以上になります。

#動作確認
タップ時に正面を向いてくれるように配置されれば完成です。
お疲れ様でした!
HelloAR_kyaegashi.gif

25
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?