My Scenario:
I have a number of markers that can be scanned and viewed at once. This all works fine. However, my client uses tablets that aren’t so great and if put down for a minute they lose the tracking and they have to stop and restart the app.
They have requested that I put in a Restart button so they don’t have to leave the app. The button I have added, and am able to remove the gameobjects from the list (easy). If you are following my thread so far then you will know what’s coming… attempting to scan the marker again doesn’t display the gameobject for that marker because the tracked images list hasn’t been cleared and it assumes it’s still there but it isn’t.
I have researched and found no solution as most threads are from a year or so ago and longer. I am hoping that someone has a solution or it has been resolved at Unity. Here’s the code. Any help would be appreciated. Thanks!
============================
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class AR_ImageTracker : MonoBehaviour
{
private ARTrackedImageManager trackedImages;
public GameObject[ ] ArPrefabs;
List ARObjects = new List();
void Awake()
{
trackedImages = GetComponent();
}
void OnEnable()
{
trackedImages.trackedImagesChanged += OnTrackedImagesChanged;
}
void OnDisable()
{
trackedImages.trackedImagesChanged -= OnTrackedImagesChanged;
}
// Event Handler
private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
//Create object based on image tracked
foreach (var trackedImage in eventArgs.added)
{
foreach (var arPrefab in ArPrefabs)
{
if (trackedImage.referenceImage.name == arPrefab.name)
{
var newPrefab = Instantiate(arPrefab, trackedImage.transform);
ARObjects.Add(newPrefab);
}
}
}
//Update tracking position
foreach (var trackedImage in eventArgs.updated)
{
foreach (var gameObject in ARObjects)
{
if (gameObject.name == trackedImage.name)
{
gameObject.SetActive(trackedImage.trackingState == TrackingState.Tracking);
}
}
}
//Remove tracking position
foreach (var trackedImage in eventArgs.removed)
{
foreach (var gameObject in ARObjects)
{
if (gameObject.name == trackedImage.name)
{
Destroy(gameObject);
}
}
}
}
public void ResetTracking() // Add a public method for reset functionality
{
foreach (var gameObject in ARObjects)
{
Destroy(gameObject);
}
ARObjects.Clear();
// Optional: Reset AR Session for potential image rediscovery
var arSession = GetComponent();
if (arSession)
{
arSession.Reset();
}
}
}
============================