Unity Learn の AR コースを AR Foundation 5 で ~ Instantiate the portal on a plane ~

Unity Learn の AR コースを AR Foundation 5 で ~ Detect when the user touches a plane ~ - You are done!

前回の続きです。今回は以下に進みます。

learn.unity.com

環境

3.Instantiate the portal

チュートリアル通りですが、私の環境では Visual Scripts に新しい型を登録する必要がありました。

4.Fix the vertical portal’s rotation

縦方向に貼り付ける対応ですね。Vertical 用の Prefab を X に 90 度回転させました。

Instantiate する Prefab も上記で編集した Vertical のものに変えています。

また、動作確認のために AR Plane Manager の Detection ModeVertical に変更しています。

5.How to limit an action to only run one time?

ここはチュートリアル通りです。実際実行すると、かなりの数がワンタップでインスタンス化されていました。

6, 7, 8

チュートリアル通りで問題ないのですが、ここでも私の環境では AR Plane Manager の型を追加しました。

同じことを C# Script でやってみる

Visual Scripts でやったことを基本なぞっています。

ただ、Instantiate する Prefab の指定だけ外部から行うように変数に出しています。(mSpawnablePrefab)

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

public class TapToPlace : MonoBehaviour
{
    [SerializeField] private ARRaycastManager mRaycastManager;
    [SerializeField] private ARPlaneManager mPlaneManager;
    [SerializeField] private GameObject mSpawnablePrefab;

    private readonly List<ARRaycastHit> _mHits = new List<ARRaycastHit>();
    private bool _mPortalSpawned;

    [SerializeField] private Text mDebugText;

    // Start is called before the first frame update
    void Start()
    {
        mDebugText.text = "Application Started / C#";
    }

    // Update is called once per frame
    void Update()
    {
        if (_mPortalSpawned)
            return;
        
        if (Input.touchCount == 0)
            return;

        if (mRaycastManager.Raycast(Input.GetTouch(0).position, _mHits, TrackableType.PlaneWithinPolygon))
        {
            mDebugText.text = "True / C#";
            
            var plane = FindObjectOfType<ARPlane>();
            
            var transform = plane.transform;
            Instantiate(mSpawnablePrefab, transform.position, transform.rotation);
            
            _mPortalSpawned = true;
            
            mPlaneManager.SetTrackablesActive(false);
            mPlaneManager.enabled = false;
        }
        else
        {
            mDebugText.text = "false / C#";
        }
    }
}

スクリプトの GameObject は以下のような変数設定になっています。

ここまでやってきて

原因を調べてないのですが、とにかく Visual Script のグラフを編集するのが重いです。。早めに解決したい。