Last active
March 18, 2025 20:56
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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