Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. We have updated the language to the Editor Terms based on feedback from our employees and community. Learn more.
    Dismiss Notice

Question ARTrackedObjectsChangedEventArgs.removed not working

Discussion in 'AR' started by Doraemon231, Aug 20, 2023.

  1. Doraemon231

    Doraemon231

    Joined:
    Dec 18, 2018
    Posts:
    22
    Code (CSharp):
    1. private void OnEnable()
    2.     {
    3.         trackedObjectManager.trackedObjectsChanged += ObjectChanged;
    4.     }
    5.  
    6.     private void OnDisable()
    7.     {
    8.         trackedObjectManager.trackedObjectsChanged -= ObjectChanged;
    9.     }
    10.  
    11.     private void ObjectChanged(ARTrackedObjectsChangedEventArgs args)
    12.     {
    13.         foreach (ARTrackedObject trackedObject in args.added)
    14.         {
    15.             Debug.Log("args.added : " + trackedObject.name);
    16.  
    17.             if (!trackedObjectList.Contains(trackedObject))
    18.             {
    19.                 trackedObjectList.Add(trackedObject);
    20.             }
    21.         }
    22.  
    23.         foreach (ARTrackedObject trackedObject in args.updated)
    24.         {
    25.             Debug.Log("args.updated : " + trackedObject.name);
    26.  
    27.             if (!trackedObjectList.Contains(trackedObject))
    28.             {
    29.                 trackedObjectList.Add(trackedObject);
    30.             }
    31.  
    32.             UpdateObject(trackedObject);
    33.         }
    34.  
    35.         foreach (ARTrackedObject trackedObject in args.removed)
    36.         {
    37.             Debug.Log("args.removed : " + trackedObject.name);
    38.  
    39.             if (trackedObjectList.Contains(trackedObject))
    40.             {
    41.                 GameObject trackedObjectContent = prefabDictionary[trackedObject.referenceObject.name];
    42.  
    43.                 trackedObjectContent.SetActive(false);
    44.                 trackedObjectList.Remove(trackedObject);
    45.             }
    46.         }
    47.     }
    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.Limited
    || 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.
     
  2. andyb-unity

    andyb-unity

    Unity Technologies

    Joined:
    Feb 10, 2022
    Posts:
    824
    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: https://docs.unity3d.com/Packages/c...l/features/image-tracking.html#tracking-state
     
  3. Doraemon231

    Doraemon231

    Joined:
    Dec 18, 2018
    Posts:
    22
    How about putting that in a sample example? The basic functions available in Vuforia aren't working at all.
     
  4. andyb-unity

    andyb-unity

    Unity Technologies

    Joined:
    Feb 10, 2022
    Posts:
    824
  5. Doraemon231

    Doraemon231

    Joined:
    Dec 18, 2018
    Posts:
    22
    Code (CSharp):
    1. using System.Collections.Generic;
    2. using UnityEngine;
    3. using UnityEngine.XR.ARFoundation;
    4. using UnityEngine.XR.ARSubsystems;
    5.  
    6. public class MultiImageTracking : MonoBehaviour
    7. {
    8.     [SerializeField]
    9.     private ARTrackedImageManager trackedImageManager;
    10.  
    11.     [SerializeField]
    12.     private GameObject[] objectPool; // 트래킹 된 이미지 위에 배치할 오브젝트들
    13.  
    14.     private Dictionary<string, GameObject> objectDictionary = new Dictionary<string, GameObject>();
    15.  
    16.     private void Awake()
    17.     {
    18.         foreach (GameObject obj in objectPool)
    19.         {
    20.             objectDictionary.Add(obj.name, obj);
    21.         }
    22.     }
    23.  
    24.     private void OnEnable()
    25.     {
    26.         trackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;
    27.     }
    28.  
    29.     private void OnDisable()
    30.     {
    31.         trackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
    32.     }
    33.  
    34.     private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
    35.     {
    36.         foreach (var trackedImage in eventArgs.added)
    37.         {
    38.             UpdateObject(trackedImage);
    39.         }
    40.  
    41.         foreach (var trackedImage in eventArgs.updated)
    42.         {
    43.             UpdateObject(trackedImage);
    44.         }
    45.  
    46.         foreach (var trackedImage in eventArgs.removed)
    47.         {
    48.             if (objectDictionary.ContainsKey(trackedImage.referenceImage.name))
    49.             {
    50.                 objectDictionary[trackedImage.referenceImage.name].SetActive(false);
    51.             }
    52.         }
    53.     }
    54.  
    55.     private void UpdateObject(ARTrackedImage trackedImage)
    56.     {
    57.  
    58.         if (trackedImage.trackingState == TrackingState.Tracking)
    59.         {
    60.             if (objectDictionary.ContainsKey(trackedImage.referenceImage.name))
    61.             {
    62.                 objectDictionary[trackedImage.referenceImage.name].SetActive(true);
    63.                 objectDictionary[trackedImage.referenceImage.name].transform.position = trackedImage.transform.position;
    64.                 objectDictionary[trackedImage.referenceImage.name].transform.rotation = trackedImage.transform.rotation;
    65.  
    66.             }
    67.         }
    68.         else
    69.         {
    70.             if (objectDictionary.ContainsKey(trackedImage.referenceImage.name))
    71.             {
    72.                 objectDictionary[trackedImage.referenceImage.name].SetActive(false);
    73.             }
    74.         }
    75.     }
    76. }
    77.  
    This code works fine on android. I took out the inactive objects in the scene beforehand.
     
  6. Doraemon231

    Doraemon231

    Joined:
    Dec 18, 2018
    Posts:
    22