iOS/Unity : the Prefab don't disappear on Image tracking.

Hello everybody,
I’m on Unity 2022.2.12, AR Foundation and ARKit version 5.0. The app works fine on my Iphone, the prefabs appear (so the images are detected and tracked). But they never disappear, even if in my script I tried do set the Prefab Inactive through the status check. Does anyone have an idea ? Does the Iphone subsystem work as intented ? Thank you.

public class PlaceTrackedEntities : MonoBehaviour
{
    ARTrackedImageManager _trackedImageManager;
    public GameObject[] arPrefabs;
    private Dictionary<string, GameObject> _instantiatedPrefabs = new Dictionary<string, GameObject>();


    private void Awake()
    {
        _trackedImageManager = GetComponent<ARTrackedImageManager>();
    }

    private void OnEnable()
    {
        
        _trackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;
    }

    private void OnDisable()
    {
       
        _trackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
    }

    // ------
    // Event Handler
    //------

    private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs args)
    {
       

        foreach (ARTrackedImage trackedImage in args.added)
        {
            ImageAdded(trackedImage);
        }

        foreach (ARTrackedImage trackedImage in args.updated)
        {
            ImageUpdated(trackedImage);
        }


        foreach (ARTrackedImage trackedImage in args.removed)
        {
            ImageRemoved(trackedImage);
        }

    }

    private void ImageAdded(ARTrackedImage trackedImage)

    {
        Debug.Log("new tracked image");
        var imageName = trackedImage.referenceImage.name;

        foreach (var curPrefab in arPrefabs)
        {
            if (string.Compare(curPrefab.name, imageName, System.StringComparison.OrdinalIgnoreCase) == 0 && !_instantiatedPrefabs.ContainsKey(imageName))
            {
                Debug.Log("Prefab  will spawn");
                var newPrefab = Instantiate(curPrefab, trackedImage.transform);

                _instantiatedPrefabs[imageName] = newPrefab;
            }
            
if (_instantiatedPrefabs.ContainsKey(imageName))
            {
                Debug.Log("Prefab  was  already spawned");
            }

        }

    }

    private void ImageRemoved(ARTrackedImage trackedImage)
    {

       
        Destroy(_instantiatedPrefabs[trackedImage.referenceImage.name]);
        Debug.Log("The prefab was destroyed");

    
        _instantiatedPrefabs.Remove(trackedImage.referenceImage.name);
        Debug.Log("The prefab was removed from the dictionnary");


    }

    private void ImageUpdated(ARTrackedImage trackedImage)

    {
        if (trackedImage.trackingState == TrackingState.None)
        {
            Debug.Log("The prefab was desactivated");
            _instantiatedPrefabs[trackedImage.referenceImage.name].SetActive(false);
        }
      
     
    }
    
}
1 Like

See our docs: AR Tracked Image Manager component | AR Foundation | 5.0.7

1 Like

im having the same issue on android build im , hen i track images for the prefabs to instaciate, they wont dissapear , and when finally its tracking i wont re spawn de the fabs . any help?

My Example is based on AR Foundation 4.2.7:

private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs args)
{
    foreach (ARTrackedImage arTrackedImage in args.added)
    {
        DebugPrinter.Print("arTrackedImage added: " + arTrackedImage.name);

        ShowContent(arTrackedImage.gameObject, true);
    }

    foreach (ARTrackedImage arTrackedImage in args.updated)
    {
        if (arTrackedImage.trackingState == TrackingState.Tracking)
        {
            ShowContent(arTrackedImage.gameObject, true);
        }
        else
        {
            ShowContent(arTrackedImage.gameObject, false);
        }
    }

    foreach (ARTrackedImage arTrackedImage in args.removed)
    {
        DebugPrinter.Print(
            "arTrackedImage removed: " + arTrackedImage.name);

        ShowContent(arTrackedImage.gameObject, false);
    }
}

private void ShowContent(GameObject gameObj, bool isShowing)
{
    // Your Actions
}

Don’t Destroy your objects! It’s a bad practice in terms of performance and so on.
Instead of that disable the MeshRenderers and use CanvasGroup.alpha for UI to hide the objects.

So such approach I implemented in my AR Video Player — Unity Asset.


What im trying to acomplish is to have múltiples prefabs for múltiple images . But when I do the first track of the prefabs when I go back to the first color to re spawn, nothing happens.

We have a scene that tracks multiple prefabs onto different images in the samples, GitHub - Unity-Technologies/arfoundation-samples: Example content for Unity projects based on AR Foundation
I hope that gives you a good idea on how to manage multiple prefabs for multiple images?