土鍋で雑多煮

UnityでXR・ゲーム開発をしています。学んだことや備忘録、趣味の記録などを書いていきます。

MENU

【Unity6・URP】Unity6&AR FoundationでAR開発を始める

はじめに

どうも、土鍋です。

開発でAR Foundationを使うことになったのですが、Unity6で若干UIや設定が変わったのでメモ的に記事を書きました。

AR Foundationのセットアップ

AR Foundationのインポート

Package ManagerでUnity Registryで「AR Foundation」を検索し、インポート。

XR Plugin設定の変更

XR Plug-in Managementから自分のビルドしたいプラットフォームのProvider plug-inを選んでください。

※私はAndroidなのでAR Coreを選択。

Project Validationですべての項目をFixしてください。

URPの設定変更

このままビルドするとうまくARが機能しないので、AR用のRenderFeatureを追加する必要があります。

ProjectSettingsのQualityからどのRenderPipelineAssetを使用しているか確認してください。

※ビルドする対象の設定を確認してください。

使用しているRenderPipelineAssetのUniversal Render Dataを選択。

Add Render FeatureでAR Background Render Featureを追加。

これで問題なくARが機能します。

平面にキャラクターを配置するアプリ

シーンのセットアップ

ここからは実際にARアプリを作ってみます。

ヒエラルキーから

XR > AR Session
XR > XR Origin

この2つを追加してください。

平面検知

XR OriginにAR Plane Managerを追加。

検出結果を表示するには

XR > AR Default Plane

を出して、それをPrefab化し、
AR Plane ManagerのPlane Prefabにセット。

これで平面検知ができるようになった。

タップした場所にオブジェクト配置

XR OriginにAR Raycast Managerを追加。

タップした場所に配置して、スワイプで向きを調整できるようにします。

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

public class ARCharacterSpawn : MonoBehaviour
{
    [SerializeField]
    private ARRaycastManager arRaycastManager = null;
    
    [SerializeField]
    private Transform characterTransform;
    
    private Vector2 _beforePosition;
    private Vector2 _nowPosition;
    private float _rotateSpeed = 5f;
    
    private void Update()
    {
        if (Input.touchCount <= 0) return;
        
        var touch = Input.GetTouch(0);

        switch (touch.phase)
        {
            case TouchPhase.Began:
                _beforePosition = touch.position;
                break;
            case TouchPhase.Moved:
            {
                // スワイプでキャラクター回転
                _nowPosition = touch.position;

                if (_nowPosition.x - _beforePosition.x != 0)
                {
                    var horizontalAngle = (_nowPosition.x - _beforePosition.x) * _rotateSpeed * Time.deltaTime;

                    characterTransform.transform.Rotate(0, horizontalAngle, 0, Space.World);
                }
                break;
            }
            case TouchPhase.Ended:
            {
                // 指を離した場所に配置
                var hitResults = new List<ARRaycastHit>();
                if (arRaycastManager.Raycast(touch.position, hitResults))
                {
                    characterTransform.position = hitResults[0].pose.position;
                }
                break;
            }
        }
    }
}

完成

参考

docs.unity3d.com

bluebirdofoz.hatenablog.com

vend9520-lab.net