「AR(現実の映像にCGを重ねる技術)を作ってみたいけど、スマホ実機がないと試せないんでしょ?」——そう思っていました。ところがUnityのAR FoundationXR Simulationを使うと、スマホ実機なしでも、Unityエディタの中の“仮想の部屋”でARを検証できます。今回は、床や壁などの平面を検出して、タップした場所に3Dモデルを置く最小サンプルを、実機ゼロで作ってみます。

📱 この記事でわかること
AR Foundationとは何か(iOSのARKit / AndroidのARCoreとの関係)
XR Simulationで、実機なしにエディタ内でARを動かす仕組み
・平面検出 → タップで3Dモデルを設置 → 移動・拡大縮小する最小サンプルとコード
・再現に必要なUnity/パッケージのバージョン・XR Simulationの有効化と、つまずきどころ

作るもの:実機なしで“壁や床にモデルを置く”AR

スポンサーリンク

完成形がこちら。Unityエディタの中に用意された仮想の部屋を、まるでスマホをかざしているように動き回ると、床や壁が「平面」として検出されます(青い半透明の面)。そして検出した面(今回は壁)をクリック(=タップの代わり)すると、そこに3Dモデル(オレンジの箱)が置かれる——という、ARの基本がまるごと実機なしで動きます。AR Foundationは床のような水平面も、壁のような垂直面も検出でき、今回はたまたま壁の面に置いています。

XR Simulationの仮想の部屋で、検出した壁にオレンジの箱を置いた画面
青い半透明の面=検出された壁。そこをクリックすると3Dモデル(オレンジの箱)が“壁に沿って”設置される。すべてUnityエディタ内・実機なし

AR Foundationとは(ARKit / ARCoreとの関係)

スマホのARは、iPhoneはARKit、AndroidはARCoreという、OSごとに別々の仕組みで動いています。これを両方バラバラに覚えるのは大変です。そこでUnityのAR Foundationが、ARKitとARCoreの“共通の窓口”になってくれます。AR Foundation向けに1回作れば、iOSでもAndroidでも動く——というのが最大の利点です。

図解:AR Foundationは“共通の窓口”。実機なしのテストがXR Simulation あなたのARアプリ1回だけ作る AR Foundation共通の窓口 ARKitiPhone(実機) ARCoreAndroid(実機) XR Simulationエディタ内(実機なし)
AR Foundationの下に、iOS=ARKit / Android=ARCore / そして“実機なしでテストできる”XR Simulationがぶら下がる。アプリは1回作ればどれでも動く

そして今回の主役が、その一番右のXR Simulation。これは実機の代わりにUnityエディタの中で動く“にせのAR端末”です。だからスマホがなくてもARの動作確認ができる——というわけです。

XR Simulationとは(エディタ内の“仮想の部屋”)

XR Simulationは、AR Foundation(6.x)に最初から入っている機能です(追加パッケージ不要)。有効にしてPlay(再生)すると、Unityが用意した仮想の部屋の中に“端末”が現れ、マウスとキーボードでその端末を持って歩き回るように動かせます。動かすと、実機と同じように床・壁・机などが平面として検出されていきます。

XR Simulationで部屋を見回すと床や壁が平面として検出される画面
仮想の部屋を“端末”で見回すと、床や壁が青い半透明の面(検出された平面)として次々に浮かび上がる。カメラを動かすほど検出が進む

ポイントは、実機に転送してビルドする手間ゼロで、平面検出やモデル設置の動きを何度でも確認できること。ARは「作る→実機に入れる→試す」の往復が重いのですが、その大半をエディタ内で済ませられます。

作り方:シーンの構成とパッケージ

必要なのは、Unityの公式メニューから置ける2つのオブジェクトと、3つの部品だけです。

  • AR Session:ARを動かす“エンジン”(メニュー:ゲームオブジェクト > XR > AR Session)
  • XR Origin (Mobile AR):ARカメラ一式(同:XR Origin (Mobile AR))。この下に次の部品を付けます
    • AR Plane Manager:平面を検出して表示する(検出面の見た目=プレハブを指定)
    • AR Raycast Manager:画面のタップ位置から平面へ“光線”を飛ばして当たり判定する
    • 設置スクリプト(自作):当たった平面にモデルを置く(後述)

下は実際のUnity画面です。左の階層にAR SessionXR Origin、そして設置されたPlacedBox(Clone)が見えます。これだけの構成で、右の“仮想の部屋”でARが動いています。

Unityエディタ全体。階層にAR Session・XR Origin、ゲームビューにARの様子
Unity 6.4のエディタ全体。左の階層は AR Session / XR Origin / PlacedBox(Clone) だけ。右のゲームビューでXR Simulationが動作中

パッケージはAR Foundation を入れるだけ(今回は 6.5.0)。XR SimulationはAR Foundationに同梱されているので、別途インストールは不要です。

コード:タップで設置・移動・拡大縮小

自作するのは、この1ファイルだけタップ位置から平面へ光線を飛ばし、当たった所にモデルを置く(すでに置いてあれば移動)。加えて、ホイール(実機ではピンチ)で拡大縮小します。XR SimulationのPlay中は、左クリックがタップの代わりになります。

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

// 検出した平面をタップすると、そこに3Dモデルを「設置」。
// もう一度タップした場所に「移動」。ホイール/ピンチで「拡大縮小」。
[RequireComponent(typeof(ARRaycastManager))]
public class PlaceOnPlane : MonoBehaviour
{
    [SerializeField] GameObject placedPrefab;   // 設置する3Dモデル
    GameObject _spawned;
    ARRaycastManager _raycaster;
    static readonly List<ARRaycastHit> _hits = new List<ARRaycastHit>();

    void Awake() => _raycaster = GetComponent<ARRaycastManager>();

    void Update()
    {
        if (!TryGetTap(out var pos)) return;
        // タップ位置から平面へ光線を飛ばし、当たった所を取得
        if (!_raycaster.Raycast(pos, _hits, TrackableType.PlaneWithinPolygon)) return;

        var pose = _hits[0].pose;   // 平面上の位置と向き
        if (_spawned == null)
            _spawned = Instantiate(placedPrefab, pose.position, pose.rotation);  // 設置
        else
            _spawned.transform.SetPositionAndRotation(pose.position, pose.rotation);  // 移動
    }

    // 実機のタップ / エディタの左クリックを「押した瞬間」だけ true
    bool TryGetTap(out Vector2 pos)
    {
        if (Input.touchCount > 0)
        {
            var t = Input.GetTouch(0);
            pos = t.position;
            return t.phase == TouchPhase.Began;
        }
        if (Input.GetMouseButtonDown(0)) { pos = Input.mousePosition; return true; }
        pos = default;
        return false;
    }
}

※ 拡大縮小(ホイール/ピンチ)は紙面の都合で省略しています。Input.mouseScrollDelta.y や2本指タッチの距離差から、置いたモデルのlocalScaleを増減させるだけです。

動かす:平面検出 → タップで設置 → 拡縮

あとはPlay(再生)して、仮想の部屋を見回すだけ。順番はこうです。

① 部屋を見回して平面を検出。ゲームビューで“端末”を動かすと、床や壁が青い面になっていきます(前の画像)。ここが最初の関門で、端末を少し動かさないと平面は出てきません(実機のスキャンと同じ)。

② 面をクリックしてモデルを設置。検出された面をクリックすると、そこにオレンジの箱が現れます(冒頭の画像/今回は壁の面に置きました)。もう一度別の場所をクリックすれば、その場所へ移動します。水平面(床)でも垂直面(壁)でも同じように置けます。

③ 拡大縮小。ホイールでモデルの大きさを変えられます。下は大きめに置いた状態。実機ではピンチ操作にあたります。

設置した箱をホイールで拡大した画面
同じ箱をホイールで拡大した状態。壁の平面に沿って置かれたまま、大きさだけが変わる(実機ではピンチに相当)

クリックひとつで、光線が平面に当たり、その場所にモデルが吸い付く——ARの「現実に物を置く」感覚が、実機なしで確かめられます。

再現に必要な設定

同じものを作るための、要点だけまとめます。

  • Unity:6.4(6000.4.5f1)で確認。AR Foundation 6系が使えるUnity 6であればOK
  • パッケージAR Foundation 6.5.0(Package Managerで追加)。XR Simulationは同梱
  • XR Simulationの有効化:プロジェクト設定 > XR Plug-in Managementデスクトップタブで XR Simulation にチェック(これを忘れるとエディタでARが動きません)
  • 入力方式:AR FoundationはInput Systemを使うため、プロジェクト設定のActive Input Handling を「Both(両方)」に。今回のコードは従来のInput(Input.GetMouseButtonDown)も使うので、両対応にしておくと安全
  • 平面の見た目:AR Plane ManagerのPlane Prefabに、半透明の面を表示するプレハブを指定(メッシュ表示コンポーネント+半透明マテリアル)

つまずきポイントと対処

  • 平面が出てこない:一番多いのがこれ。“端末”を止めたままだと平面は検出されません。ゲームビューで右ボタンを押しながらWASDで少し歩き回ると、床や壁が次々に検出されます(実機で部屋をスキャンするのと同じ動きをエディタでやる)。
  • エディタでARが起動しない:XR Plug-in ManagementでXR Simulationにチェックが入っているかを確認。未チェックだと「XR Environment is not Available」と表示されます。
  • クリックしても置けない:入力方式が新Input Systemのみだと、旧Inputが例外になります。Active Input Handlingを「Both」に。また最初の1クリックはゲームビューへのフォーカスに吸われることがあるので、もう一度クリックを。
  • 置いたモデルが平面を突き抜ける/浮く:モデルの原点(ピボット)が中心だと半分めり込みます。原点を底面に合わせるか、設置時に高さを半分持ち上げると自然になります。
  • 実機との違い:XR Simulationはあくまで“仮想の部屋”。実際のカメラ映像・現実の光や影・トラッキングのブレは再現しません。最終確認は実機で、という前提で「作り込みの大半をエディタで速く回す」使い方が向いています。

まとめ

UnityのAR FoundationとXR Simulationを使って、スマホ実機ゼロで“壁や床にモデルを置く”ARの基本を作れました。AR FoundationがARKit / ARCoreの共通の窓口になり、XR Simulationがエディタ内の仮想の部屋で実機の代わりをしてくれる——この2つのおかげで、ARの試作がぐっと手軽になります。

  • 必要なのは AR Session+XR Origin と、平面検出・レイキャスト・設置スクリプトの最小構成
  • コードは「タップ位置から平面へ光線→当たった所にモデル」の1ファイルだけ
  • XR Simulationは有効化と“端末を動かす”のがコツ。実機との違いは押さえつつ、試作を高速に回せる

「ARは実機がないと始められない」と思って踏み出せずにいたなら、まずはこのエディタ内ARから触ってみるのがおすすめです。平面が検出され、クリックした面にモデルが吸い付く瞬間は、実機さながらの手応えがあります。

それでは、今回はここまで。最後までありがとうございました😊