1
0
mirror of https://projects.caleb-brown.dev/UDRI-XRT/UDRIGEEKCup2024.git synced 2025-01-24 08:08:26 -05:00
UDRIGEEKCup2024/Assets/Scripts/AR/TrackedImageChanged.cs
2024-04-16 15:39:29 -04:00

125 lines
4.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
namespace AR
{
public class TrackedImageChanged : MonoBehaviour
{
[SerializeField] ARTrackedImageManager m_TrackedImageManager;
[SerializeField] private List<ARTrackedImage> _arTrackedImagePrefabs = new ();
private List<ARTrackedImage> _spawned = new ();
#if UNITY_EDITOR
[Header("Debug")]
[SerializeField] private InputAction m_DebugListImages;
#endif
void OnEnable()
{
m_TrackedImageManager.trackedImagesChanged += OnChange;
#if UNITY_EDITOR
m_DebugListImages.Enable();
m_DebugListImages.performed += Debug_ListImages;
#endif
}
void OnDisable()
{
m_TrackedImageManager.trackedImagesChanged -= OnChange;
#if UNITY_EDITOR
m_DebugListImages.performed -= Debug_ListImages;
m_DebugListImages.Disable();
#endif
}
private void OnChange(ARTrackedImagesChangedEventArgs eventArgs)
{
foreach (var newImage in eventArgs.added)
{
// Handle added event
Debug.Log($"Added image: {newImage.referenceImage.name}");
foreach (var prefab in _arTrackedImagePrefabs)
{
if (prefab.referenceImage.name.Equals(newImage.referenceImage.name))
{
if (_spawned == null)
{
_spawned = new List<ARTrackedImage>();
}
// Spawn new object
Debug.Log("Spawning object...");
_spawned.Add(Instantiate(prefab, newImage.transform));
}
}
}
foreach (var updatedImage in eventArgs.updated)
{
// Handle updated event
Debug.Log($"Updated image: {updatedImage.trackableId} - {updatedImage.trackingState}");
foreach (var spawnedObject in _spawned)
{
if (spawnedObject.trackableId == updatedImage.trackableId)
{
// Update position
Debug.Log("Updating position...");
spawnedObject.transform.position = updatedImage.transform.position;
}
}
}
foreach (var removedImage in eventArgs.removed)
{
// Handle removed event
Debug.Log($"Removed image: {removedImage.referenceImage.name}");
for (int i = _spawned.Count - 1; i >= 0; i--)
{
var spawnedObject = _spawned[i];
if (spawnedObject.trackableId == removedImage.trackableId)
{
// Handle object removal
Debug.Log("Removing object...");
if (_spawned.Remove(spawnedObject))
{
// Destroy object
Debug.Log("Destroying object...");
Destroy(spawnedObject.gameObject);
}
}
}
}
}
private void ListAllImages()
{
Debug.Log(
$"There are {m_TrackedImageManager.trackables.count} images being tracked.");
foreach (var trackedImage in m_TrackedImageManager.trackables)
{
Debug.Log($"Image: {trackedImage.referenceImage.name} is at " +
$"{trackedImage.transform.position}");
}
}
private ARTrackedImage GetImageAt(TrackableId trackableId)
{
return m_TrackedImageManager.trackables[trackableId];
}
private void Debug_ListImages(InputAction.CallbackContext _) => ListAllImages();
}
}