1

I'm working on a project that I need to track images on a catalog and show the respectives 3D models to each page. Nothing complex by now, just the functional demo. It needs to show a 3D model per time, show nothing when there isn't a reference image on the screen, and I need to be able to return to previous images. I couldn't find a code like that, even in the samples provided by Unity. I'm new at Unity and C# programming, so I'm having a hard time when trying to change codes I've found here and on YouTube.

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ImageTracking2: MonoBehaviour
{
    public string ReferenceImageName;
    private ARTrackedImageManager _TrackedImageManager;
    private void Awake()
    {
        _TrackedImageManager = FindObjectOfType<ARTrackedImageManager>();
    }
    private void OnEnable()
    {
        if (_TrackedImageManager != null)
        {
            _TrackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;
        }
    }
    private void OnDisable()
    {
        if (_TrackedImageManager != null)
        {
            _TrackedImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
        }
    }
    private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs e)
    {
        foreach (var trackedImage in e.added)
        {
            Debug.Log($"Tracked image detected: {trackedImage.referenceImage.name} with size: {trackedImage.size}");
        }
        UpdateTrackedImages(e.added);
        UpdateTrackedImages(e.updated);
    }
    private void UpdateTrackedImages(IEnumerable<ARTrackedImage> trackedImages)
    {
        // If the same image (ReferenceImageName)
        var trackedImage =
            trackedImages.FirstOrDefault(x => x.referenceImage.name == ReferenceImageName);
        if (trackedImage == null)
        {
            return;
        }
   
        if (trackedImage.trackingState != TrackingState.None)
        {
            var trackedImageTransform = trackedImage.transform;
            transform.SetPositionAndRotation(trackedImageTransform.position, trackedImageTransform.rotation);
        }
    }
}

This one above works well, somebody shared with the Unity Forum. But how can I make the game object disappear when the camera looses the reference, maybe after a second? (this is attached to the prefabs, individually. works perfectly, but the game objects of my 3D models keep forever on the screen once they get enabled). Thanks in advance.

Brahe
  • 7
  • 4

0 Answers0