private void Start() { #if UNITY_ANDROID && AR_ON // We want to display notifications about tracking only when the camera feed is on screen (only in project or scene edit). GameManager.Instance.OnOpenProjectEditor += StartTrackingNotifications; GameManager.Instance.OnOpenSceneEditor += StartTrackingNotifications; GameManager.Instance.OnRunPackage += StartTrackingNotifications; // We want to stop notifications everywhere else. GameManager.Instance.OnCloseProject += StopTrackingNotifications; GameManager.Instance.OnCloseScene += StopTrackingNotifications; GameManager.Instance.OnStopPackage += StopTrackingNotifications; CalibrationManager.Instance.OnARCalibrated += OnARCalibrated; ARPlaneManager.planesChanged += OnPlanesChanged; ARPointCloudManager.pointCloudsChanged += OnPointCloudChanged; mainCamera = Camera.main.transform; //ARTrackedImageManager.trackedImagesChanged += OnTrackedImagesChanged; deviceTrackingStatus = DeviceTrackingStatus.NotTracking; anchorTrackingStatus = AnchorTrackingStatus.NotCalibrated; #endif }
/// <summary> /// Called when anchors of the ARAnchorManager are changed (not tracking, tracking, added, etc.) /// </summary> /// <param name="obj"></param> private void OnAnchorsChanged(ARAnchorsChangedEventArgs obj) { // TODO: check if it is working for cloud anchors if (CalibrationManager.Instance.Calibrated) { if (!CalibrationManager.Instance.UsingCloudAnchors) { //if (obj.updated[obj.updated.IndexOf(CalibrationManager.Instance.WorldAnchorLocal)].trackingState == TrackingState.Tracking) { switch (CalibrationManager.Instance.WorldAnchorLocal.trackingState) { case TrackingState.Tracking: if (anchorTrackingStatus != AnchorTrackingStatus.Tracking) { // cancel previously invoked tracking failure notification StopTrackingFailureNotifications(); StopTrackingFailureTimeout(); anchorTrackingStatus = AnchorTrackingStatus.Tracking; if (deviceTrackingStatus == DeviceTrackingStatus.WaitingForAnchor) { Notifications.Instance.ShowNotification("Tracking state", "Session Tracking"); GameManager.Instance.SceneSetActive(true); deviceTrackingStatus = DeviceTrackingStatus.Tracking; StopTrackingFailureNotifications(stopVideoOverride: true); } } break; case TrackingState.Limited: case TrackingState.None: // cancel previously invoked tracking failure notification StopTrackingFailureNotifications(); trackingAnchorFailureNotify = StartCoroutine(TrackingFailureNotify("Tracking lost!", "Look around your workspace.", 9f, anchorTrackingFailure: true)); TrackingLostAnimation.PlayVideo(); anchorTrackingStatus = AnchorTrackingStatus.NotTracking; GameManager.Instance.SceneSetActive(false); if (trackingAnchorFailureTimeout == null) { trackingAnchorFailureTimeout = StartCoroutine(TrackingFailureTimeout(AnchorTrackingLostTimeout)); } break; } } } else { anchorTrackingStatus = AnchorTrackingStatus.NotCalibrated; } }
/// <summary> /// Called when AR tracking changes. On event ARSession.stateChanged /// </summary> /// <param name="sessionState"></param> private void ARSessionStateChanged(ARSessionStateChangedEventArgs sessionState) { // cancel previously invoked tracking failure notification if (trackingFailureNotify != null) { StopCoroutine(trackingFailureNotify); // stop the video only if world anchor is tracking if (anchorTrackingStatus == AnchorTrackingStatus.Tracking) { TrackingLostAnimation.StopVideo(); } trackingFailureNotify = null; } switch (sessionState.state) { case ARSessionState.Unsupported: Notifications.Instance.ShowNotification("Tracking not supported", "This device does not support ARCore!"); break; case ARSessionState.None: case ARSessionState.CheckingAvailability: case ARSessionState.NeedsInstall: case ARSessionState.Installing: case ARSessionState.Ready: case ARSessionState.SessionInitializing: switch (ARSession.notTrackingReason) { case NotTrackingReason.None: // tracking should work normally break; case NotTrackingReason.InsufficientLight: trackingFailureNotify = StartCoroutine(TrackingFailureNotify("Tracking lost due to insufficient light!", "Enlight your environment.", 9f)); deviceTrackingStatus = DeviceTrackingStatus.InsufficientLight; GameManager.Instance.SceneSetActive(false); break; case NotTrackingReason.InsufficientFeatures: trackingFailureNotify = StartCoroutine(TrackingFailureNotify("Tracking lost due to insufficient features!", "Try to move the device slowly around your environment.", 9f)); TrackingLostAnimation.PlayVideo(); deviceTrackingStatus = DeviceTrackingStatus.InsufficientFeatures; GameManager.Instance.SceneSetActive(false); break; case NotTrackingReason.ExcessiveMotion: trackingFailureNotify = StartCoroutine(TrackingFailureNotify("Tracking lost due to excessive motion!", "You are moving the device too fast.", 9f)); TrackingLostAnimation.PlayVideo(); deviceTrackingStatus = DeviceTrackingStatus.ExcessiveMotion; GameManager.Instance.SceneSetActive(false); break; case NotTrackingReason.Initializing: case NotTrackingReason.Relocalizing: case NotTrackingReason.Unsupported: trackingFailureNotify = StartCoroutine(TrackingFailureNotify("Tracking lost!", "Reason: " + ARSession.notTrackingReason.ToString(), 9f)); deviceTrackingStatus = DeviceTrackingStatus.UnknownFailure; GameManager.Instance.SceneSetActive(false); break; } break; case ARSessionState.SessionTracking: // Check if world anchor is tracking if (anchorTrackingStatus == AnchorTrackingStatus.Tracking) { // Anchor and device is tracking normally Notifications.Instance.ShowNotification("Tracking state", "Session Tracking"); deviceTrackingStatus = DeviceTrackingStatus.Tracking; GameManager.Instance.SceneSetActive(true); StopTrackingFailureNotifications(stopVideoOverride: true); } else { deviceTrackingStatus = DeviceTrackingStatus.WaitingForAnchor; } break; } }