private void OnEnable()
{
trackedObjectManager.trackedObjectsChanged += ObjectChanged;
}
private void OnDisable()
{
trackedObjectManager.trackedObjectsChanged -= ObjectChanged;
}
private void ObjectChanged(ARTrackedObjectsChangedEventArgs args)
{
foreach (ARTrackedObject trackedObject in args.added)
{
Debug.Log("args.added : " + trackedObject.name);
if (!trackedObjectList.Contains(trackedObject))
{
trackedObjectList.Add(trackedObject);
}
}
foreach (ARTrackedObject trackedObject in args.updated)
{
Debug.Log("args.updated : " + trackedObject.name);
if (!trackedObjectList.Contains(trackedObject))
{
trackedObjectList.Add(trackedObject);
}
UpdateObject(trackedObject);
}
foreach (ARTrackedObject trackedObject in args.removed)
{
Debug.Log("args.removed : " + trackedObject.name);
if (trackedObjectList.Contains(trackedObject))
{
GameObject trackedObjectContent = prefabDictionary[trackedObject.referenceObject.name];
trackedObjectContent.SetActive(false);
trackedObjectList.Remove(trackedObject);
}
}
}
I’m trying to disable it when tracking doesn’t work.
args.removed
is not called.
So I’m trying to determine
|| trackedObject.trackingState == TrackingState.None```
, but that doesn't work either.
Any workaround? I think this problem is years old. I am waiting for it to be fixed.
Neither ARCore nor ARKit use the removed
state very much. This is not a bug-- it’s simply a matter of how Google and Apple have implemented their platforms.
You are correct to inspect the tracking state, however your code posted here does not use the tracking state values. You should inspect the tracking state of updated
trackables to see if they have changed to Limited
or back to Tracking
.
Docs: AR Tracked Image Manager component | AR Foundation | 5.0.7
1 Like
How about putting that in a sample example? The basic functions available in Vuforia aren’t working at all.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class MultiImageTracking : MonoBehaviour
{
[SerializeField]
private ARTrackedImageManager trackedImageManager;
[SerializeField]
private GameObject[] objectPool; // 트래킹 된 이미지 위에 배치할 오브젝트들
private Dictionary<string, GameObject> objectDictionary = new Dictionary<string, GameObject>();
private void Awake()
{
foreach (GameObject obj in objectPool)
{
objectDictionary.Add(obj.name, obj);
}
}
private void OnEnable()
{
trackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;
}
private void OnDisable()
{
trackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
}
private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
foreach (var trackedImage in eventArgs.added)
{
UpdateObject(trackedImage);
}
foreach (var trackedImage in eventArgs.updated)
{
UpdateObject(trackedImage);
}
foreach (var trackedImage in eventArgs.removed)
{
if (objectDictionary.ContainsKey(trackedImage.referenceImage.name))
{
objectDictionary[trackedImage.referenceImage.name].SetActive(false);
}
}
}
private void UpdateObject(ARTrackedImage trackedImage)
{
if (trackedImage.trackingState == TrackingState.Tracking)
{
if (objectDictionary.ContainsKey(trackedImage.referenceImage.name))
{
objectDictionary[trackedImage.referenceImage.name].SetActive(true);
objectDictionary[trackedImage.referenceImage.name].transform.position = trackedImage.transform.position;
objectDictionary[trackedImage.referenceImage.name].transform.rotation = trackedImage.transform.rotation;
}
}
else
{
if (objectDictionary.ContainsKey(trackedImage.referenceImage.name))
{
objectDictionary[trackedImage.referenceImage.name].SetActive(false);
}
}
}
}
This code works fine on android. I took out the inactive objects in the scene beforehand.
Thank you for your kind reply.