Exemple #1
0
    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
    }
Exemple #2
0
    /// <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;
        }
    }
Exemple #3
0
    /// <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;
        }
    }