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);
}
}
}