---
title: "AR による平面上へのオブジェクトの配置"
content_type: tutorial
url: "https://learn.unity.com/tutorial/placing-an-object-on-a-plane-in-ar-jp?language=ja"
language: ja
difficulty: beginner
duration_minutes: 35
unity_version:
  - "2019.4"
supported_unity_versions:
  - name: "2019.4"
    url: "https://learn.unity.com/tutorial/placing-an-object-on-a-plane-in-ar-jp.md?language=ja&version=2019.4"
available_languages:
  - name: "en"
    url: "https://learn.unity.com/tutorial/placing-an-object-on-a-plane-in-ar.md?language=en"
  - name: "ja"
    url: "https://learn.unity.com/tutorial/placing-an-object-on-a-plane-in-ar-jp.md?language=ja"
last_updated: "2026-08-04T14:23:16.000Z"
---

# AR による平面上へのオブジェクトの配置

AR Foundation の平面検出とタップジェスチャーで水平方向の平面上にオブジェクトを配置する方法を学びます。

本チュートリアルでは、AR foundation の平面検出を利用し、タップジェスチャーで水平方向の平面上にオブジェクトを配置する方法を学びます。

## Materials

- [Tap to place object YT video](https://www.youtube.com/watch?time_continue=14&v=xguiSueY1Lw&feature=emb_title)
- [Plane detection YT video](https://www.youtube.com/watch?v=uWWiYfPTUtU)
- [Plane Manager](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.1/manual/plane-manager.html)
- [AR Raycast Manager](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@3.0/api/UnityEngine.XR.ARFoundation.ARRaycastManager.html)
- [AR Raycast Hit documentation](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@3.0/api/UnityEngine.XR.ARFoundation.ARRaycastHit.html)

## 1. 概要

このチュートリアルでは、AR Foundation の平面検出を使ってオブジェクトを平面上に配置する方法を理解します。さらに、タップ・ジェスチャーを使ってオブジェクトをインスタンス化する方法も学びます。また、検出された平面上にタップでオブジェクトを配置する機能を持つ AR アプリを作成します。

## 2. 平面検出の有効化

AR foundation で平面検出を可能にする方法を学びます。

1\. Hierarchy に移動し、AR Session Origin オブジェクトをダブルクリックします。

2\. Plane Manager コンポーネントを追加します (**画像 1**)

![画像 1：コンポーネントを追加するドロップダウンメニュー](https://connect-mediagw.unity.com/h1/20201105/learn/images/96078e19-3338-4f40-ab5f-36687c3cfe0c_57.png)

3\. Detection Mode のドロップダウンメニューで **Horizontal** を選択します (**画像 2**)。最初に **Nothing** をクリックしてから、**Horizontal** に設定する必要があるかもしれません。

![画像 2：平面検出モードのドロップダウンメニュー](https://connect-mediagw.unity.com/h1/20201217/learn/images/3e1cbfd6-425e-4e9f-96fe-bd11b798519f_image.png)

4\. Manager が水平方向の平面を検出するようになりました。

## 3. 平面の可視化

平面検出を有効にした後、Prefab オブジェクトを使って平面を可視化する方法を紹介します。

1\. Scene ビューで、コンテキストメニューから **GameObject** > **XR** > **AR Default Plane** の順に選択して、AR Default Plane オブジェクトを作成します (**画像 3**)。

![画像 3：AR Default Plane オブジェクトの作成](https://connect-mediagw.unity.com/h1/20201105/learn/images/786c88bf-3905-42e9-a1b1-a0ea8429ca4f_55.png)

2\. AR Default Plane をプレハブとして保存します。

3\. AR Default Plane プレハブを AR Plane Manager の Plane プレハブフィールドにドラッグアンドドロップします (**画像 4**)

![画像 4：アセットをフィールドにドラッグアンドドロップする](https://connect-mediagw.unity.com/h1/20201105/learn/images/068afa34-93f2-49c6-a711-7681c177f14b_54.png)

4\. シーン内の AR Default Plane ゲームオブジェクトを削除します。

5\. 結果：水平方向の平面の検出 (**画像 5**)

![画像 5：検出された平面](https://connect-mediagw.unity.com/h1/20201105/learn/images/fad77e6b-c73c-4089-8578-eb6655ea6f45_99.jpg)

## 4. 平面上にキューブを配置する

AR Raycast Manager と AR Reference Point Manager を使用して、ユーザーが画面をタップしたときにキューブを平面上に配置することができます。基準点を使用することで、アプリケーションのトラッキング精度が向上し、通常、AR コンテンツを作成する際のベストプラクティスとして使用されます。

1\. AR Session Origin に AR Raycast Manager を追加します

2\. AR Session Origin に AR Reference Point Manager を追加します

3\. 新しい C# スクリプトを作成し、名前を **TapToPlace** とします

4\. TapToPlace C# スクリプトを AR セッションオリジンに追加します

   a. このスクリプトは、レイキャスティングとタッチ検出を使用して、ユーザーが携帯電話の画面上でタップした場所に応じてキューブを平面上に配置します。

```csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class TapToPlace : MonoBehaviour
{
    //Remove all reference points created
    public void RemoveAllReferencePoints()
    {
        foreach (var referencePoint in m_ReferencePoint)
        {
            m_ReferencePointManager.RemoveReferencePoint(referencePoint);
        }
        m_ReferencePoint.Clear();
    }


    void Awake()
    {
        m_RaycastManager = GetComponent<ARRaycastManager>();
        m_ReferencePointManager = GetComponent<ARReferencePointManager>();
        m_PlaneManager = GetComponent<ARPlaneManager>();
        m_ReferencePoint = new List<ARReferencePoint>();
    }


    bool TryGetTouchPosition(out Vector2 touchPosition)
    {
        if (Input.touchCount > 0)
        {
            touchPosition = Input.GetTouch(0).position;
            return true;
        }

        touchPosition = default;
        return false;
    }

    void Update()
    {
        if (!TryGetTouchPosition(out Vector2 touchPosition))
            return;

        if (m_RaycastManager.Raycast(touchPosition, s_Hits, TrackableType.PlaneWithinPolygon))
        {
            // Raycast hits are sorted by distance, so the first one
            // will be the closest hit.
            var hitPose = s_Hits[0].pose;
            TrackableId planeId = s_Hits[0].trackableId; //get the ID of the plane hit by the raycast
            var referencePoint = m_ReferencePointManager.AttachReferencePoint(m_PlaneManager.GetPlane(planeId), hitPose);
            if (referencePoint != null)
            {
                RemoveAllReferencePoints();
                m_ReferencePoint.Add(referencePoint);
            }
        }
    }

    static List<ARRaycastHit> s_Hits = new List<ARRaycastHit>();

    ARRaycastManager m_RaycastManager;
    ARReferencePointManager m_ReferencePointManager;
    List<ARReferencePoint> m_ReferencePoint; 
    ARPlaneManager m_PlaneManager;

}
```

4\.  空のゲームオブジェクトを作成します (**画像 6**)。

![画像 6：空のゲームオブジェクトを作成](https://connect-mediagw.unity.com/h1/20201105/learn/images/d58a4176-2220-42e9-9cea-c15962e34142_53.png)

5\. キューブを作成します。スケールと位置を変更して、平面上にリアルに収まるようにしましょう (**画像 7**) 。

![画像 7：適正な寸法と位置のキューブ](https://connect-mediagw.unity.com/h1/20201105/learn/images/f3510e17-a5ef-4353-a802-02dcebca1ba0_52.png)

6\. Inspector でキューブの scale をすべての次元で 0.5 に設定します

7\. キューブの position を y 次元で 0.5 に設定します

8\. 空のゲームオブジェクトの下にキューブをドラッグして親にします (**画像 8**)

![画像 8：キューブは、空のゲームオブジェクトの子です](https://connect-mediagw.unity.com/h1/20201105/learn/images/fbb21a10-53c8-47b2-bb40-93d51e2f654c_51.png)

9\. キューブのプレハブを作成し、親となるゲームオブジェクトをスクリプトコンポーネントのフィールドにドラッグします (**画像 9**)

![画像 9：Inspector のプレハブを使ったスクリプトを表示](https://connect-mediagw.unity.com/h1/20201105/learn/images/ced237aa-de2c-4f6f-bdf5-1a67adcf1ae8_50.png)

11\. プロジェクトをビルドして実行します。キューブをインスタンス化するには、必ずスクリーンをタップしてください！

12\. 結果、以下のようになります (**画像 10**)：

![画像 10：平面上にキューブを配置](https://connect-mediagw.unity.com/h1/20201105/learn/images/b9aad6ea-3a70-4ca3-9378-50b7ab11a653_100.jpg)

## 5. まとめ

このチュートリアルでは、AR Foundation プロジェクトに平面検出、基準点、タッチジェスチャーの機能を追加しました。このプロジェクトは、ユーザーがさまざまなユースケースに合わせてプロジェクトをカスタマイズするための足がかりとなります。
