LoginSignup
Hayato1117
@Hayato1117

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ARFoundationのImageTrackingにて同じ画像を再度読み込む方法

解決したいこと

ARFoundationのImageTrackingにて同じ画像を再度読み込む方法

Unityで複数枚の画像を登録しておき、カメラでそれらを一枚ずつ読み取り、その読み取った画像ごとに異なるプレハブを画面に出現させるアプリをつくっています。「この画像を読み取ったときは、このプレハブを表示する」といったやりかたです。
平たく言うと、画像をARマーカーとしてあらかじめ登録し、それをカメラで読み込むことによって、3Dモデルのプレハブを出しています。

『foreach (var trackedImage in eventArgs.added)』の時、この行為を実行するようになっているのですが、どうやら最初の一回の時しかこれは実行されないそうです。addedではなく、uppdatedで試しましたが、それでは頻度が高すぎました。

画像を読み込んだ時に、それが初めての時でなくとも、しっかりとそれを認識し、プレハブを表示できるようにしたいです。
解決方法を教えてくだされば幸いです。

開発環境
Unity2020.3.26f1
ARFoundation4.1.10
macOS Monterey12.4
iPhone XS
iOS15.6.1

該当するソースコード


        void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
        {
            foreach (var trackedImage in eventArgs.added)
            {
                // Give the initial image a reasonable default scale
                var minLocalScalar = Mathf.Min(trackedImage.size.x, trackedImage.size.y) / 2;
                trackedImage.transform.localScale = new Vector3(minLocalScalar, minLocalScalar, minLocalScalar);
                AssignPrefab(trackedImage);
            }

            foreach (var trackedImage in eventArgs.updated)
            {
                // Give the initial image a reasonable default scale
        }
}

        void AssignPrefab(ARTrackedImage trackedImage)
        {
            if (m_PrefabsDictionary.TryGetValue(trackedImage.referenceImage.guid, out var prefab))
                m_Instantiated[trackedImage.referenceImage.guid] = Instantiate(prefab, trackedImage.transform);
        }

        public GameObject GetPrefabForReferenceImage(XRReferenceImage referenceImage)
            => m_PrefabsDictionary.TryGetValue(referenceImage.guid, out var prefab) ? prefab : null;

        public void SetPrefabForReferenceImage(XRReferenceImage referenceImage, GameObject alternativePrefab)
        {
            m_PrefabsDictionary[referenceImage.guid] = alternativePrefab;
            if (m_Instantiated.TryGetValue(referenceImage.guid, out var instantiatedPrefab))
            {
                m_Instantiated[referenceImage.guid] = Instantiate(alternativePrefab, instantiatedPrefab.transform.parent);
                Destroy(instantiatedPrefab);
            }
        }

0

No Answers yet.

Your answer might help someone💌