private void CloudManager_AnchorLocated(object sender, AnchorLocatedEventArgs args) { QueueOnUpdate(new Action(() => Debug.Log($"Anchor recognized as a possible Azure anchor"))); if (args.Status == LocateAnchorStatus.Located || args.Status == LocateAnchorStatus.AlreadyTracked) { currentCloudAnchor = args.Anchor; QueueOnUpdate(() => { Debug.Log($"Azure anchor located successfully"); // Notify AnchorFeedbackScript OnASAAnchorLocated?.Invoke(); #if UNITY_ANDROID || UNITY_IOS Pose anchorPose = Pose.identity; anchorPose = currentCloudAnchor.GetPose(); #endif #if WINDOWS_UWP || UNITY_WSA // HoloLens: The position will be set based on the unityARUserAnchor that was located. // Create a local anchor at the location of the object in question gameObject.CreateNativeAnchor(); // Notify AnchorFeedbackScript OnCreateLocalAnchor?.Invoke(); // On HoloLens, if we do not have a cloudAnchor already, we will have already positioned the // object based on the passed in worldPos/worldRot and attached a new world anchor, // so we are ready to commit the anchor to the cloud if requested. // If we do have a cloudAnchor, we will use it's pointer to setup the world anchor, // which will position the object automatically. if (currentCloudAnchor != null) { Debug.Log("Local anchor position successfully set to Azure anchor position"); gameObject.GetComponent <UnityEngine.XR.WSA.WorldAnchor>().SetNativeSpatialAnchorPtr(currentCloudAnchor.LocalAnchor); } #else Debug.Log($"Setting object to anchor pose with position '{anchorPose.position}' and rotation '{anchorPose.rotation}'"); transform.position = anchorPose.position; transform.rotation = anchorPose.rotation; // Create a native anchor at the location of the object in question gameObject.CreateNativeAnchor(); // Notify AnchorFeedbackScript OnCreateLocalAnchor?.Invoke(); #endif }); } else { QueueOnUpdate(new Action(() => Debug.Log($"Attempt to locate Anchor with ID '{args.Identifier}' failed, locate anchor status was not 'Located' but '{args.Status}'"))); } }
public async void CreateAzureAnchor(GameObject theObject) { Debug.Log("\nAnchorModuleScript.CreateAzureAnchor()"); // Notify AnchorFeedbackScript OnCreateAnchorStarted?.Invoke(); // First we create a native XR anchor at the location of the object in question theObject.CreateNativeAnchor(); // Notify AnchorFeedbackScript OnCreateLocalAnchor?.Invoke(); // Then we create a new local cloud anchor CloudSpatialAnchor localCloudAnchor = new CloudSpatialAnchor(); // Now we set the local cloud anchor's position to the native XR anchor's position localCloudAnchor.LocalAnchor = theObject.FindNativeAnchor().GetPointer(); // Check to see if we got the local XR anchor pointer if (localCloudAnchor.LocalAnchor == IntPtr.Zero) { Debug.Log("Didn't get the local anchor..."); return; } else { Debug.Log("Local anchor created"); } // In this sample app we delete the cloud anchor explicitly, but here we show how to set an anchor to expire automatically localCloudAnchor.Expiration = DateTimeOffset.Now.AddDays(7); // Save anchor to cloud while (!cloudManager.IsReadyForCreate) { await Task.Delay(330); float createProgress = cloudManager.SessionStatus.RecommendedForCreateProgress; QueueOnUpdate(new Action(() => Debug.Log($"Move your device to capture more environment data: {createProgress:0%}"))); } bool success; try { Debug.Log("Creating Azure anchor... please wait..."); // Actually save await cloudManager.CreateAnchorAsync(localCloudAnchor); // Store currentCloudAnchor = localCloudAnchor; localCloudAnchor = null; // Success? success = currentCloudAnchor != null; if (success) { Debug.Log($"Azure anchor with ID '{currentCloudAnchor.Identifier}' created successfully"); // Notify AnchorFeedbackScript OnCreateAnchorSucceeded?.Invoke(); // Update the current Azure anchor ID Debug.Log($"Current Azure anchor ID updated to '{currentCloudAnchor.Identifier}'"); currentAzureAnchorID = currentCloudAnchor.Identifier; } else { Debug.Log($"Failed to save cloud anchor with ID '{currentAzureAnchorID}' to Azure"); // Notify AnchorFeedbackScript OnCreateAnchorFailed?.Invoke(); } } catch (Exception ex) { Debug.Log(ex.ToString()); } }