Unity Learn の AR コースを AR Foundation 5 で ~ Detect when the user touches a plane ~ - You are done!
前回の続きです。今回は以下に進みます。
環境
3.Instantiate the portal
チュートリアル通りですが、私の環境では Visual Scripts に新しい型を登録する必要がありました。
4.Fix the vertical portal’s rotation
縦方向に貼り付ける対応ですね。Vertical 用の Prefab を X に 90 度回転させました。
Instantiate
する Prefab も上記で編集した Vertical のものに変えています。
また、動作確認のために AR Plane Manager の Detection Mode
を Vertical
に変更しています。
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 のグラフを編集するのが重いです。。早めに解決したい。