Skip to content

Instantly share code, notes, and snippets.

@DanMillerDev
Last active March 18, 2025 20:56
Show Gist options
  • Save DanMillerDev/e72d988e5f1691abb1f9e6b4cc14c975 to your computer and use it in GitHub Desktop.
Save DanMillerDev/e72d988e5f1691abb1f9e6b4cc14c975 to your computer and use it in GitHub Desktop.
A script that listens to trackable changed events for the ARAnchor manager and can recall saved anchors when an application is relaunched.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class AnchorRecallManager : MonoBehaviour
{
[SerializeField]
ARAnchorManager m_AnchorManager;
const float k_WaitDelay = 1.0f;
[SerializeField]
GameObject m_AnchorVisualObjectPrefab;
List<ARSaveOrLoadAnchorResult> m_LoadResults = new();
public static Dictionary<TrackableId, SerializableGuid> savedGuidsByTrackableId = new();
void OnEnable()
{
m_AnchorManager.trackablesChanged.AddListener(OnAnchorsChanged);
}
void OnDisable()
{
m_AnchorManager.trackablesChanged.RemoveListener(OnAnchorsChanged);
}
IEnumerator Start()
{
yield return new WaitForSeconds(k_WaitDelay);
foreach(var anchor in m_AnchorManager.trackables)
{
var visualObject = Instantiate(m_AnchorVisualObjectPrefab, anchor.transform.position, anchor.transform.rotation);
visualObject.transform.SetParent(anchor.transform);
}
if (m_AnchorManager.descriptor.supportsLoadAnchor)
LoadAllAnchors();
}
async void LoadAllAnchors()
{
try
{
var anchorDict = await AnchorSaveFile.instance.GetSavedAnchorsDataAsync();
await m_AnchorManager.TryLoadAnchorsAsync(anchorDict.Keys, m_LoadResults, null);
foreach (var result in m_LoadResults)
{
if (result.resultStatus.IsError())
{
Debug.LogError($"Failed to load an anchor with status {result.resultStatus}");
continue;
}
savedGuidsByTrackableId[result.anchor.trackableId] = result.savedAnchorGuid;
}
}
catch (OperationCanceledException)
{
Debug.LogError("Load operation was cancelled.");
}
finally
{
m_LoadResults.Clear();
}
}
void OnAnchorsChanged(ARTrackablesChangedEventArgs<ARAnchor> eventArgs)
{
foreach (var anchor in eventArgs.added)
{
Debug.Log($"Anchor added: {anchor.trackableId}");
var visualObject = Instantiate(m_AnchorVisualObjectPrefab, anchor.transform.position, anchor.transform.rotation);
visualObject.transform.SetParent(anchor.transform);
}
foreach (var anchor in eventArgs.updated)
{
Debug.Log($"Anchor updated: {anchor.trackableId}");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment