Пример #1
0
        /// <summary>
        /// Ends the movement session if a session was previously active.
        /// </summary>
        /// <param name="forceEnd"> Forces the movement to end and not return pending if it's true. </param>
        public void EndMovementSession(bool forceEnd = false)
        {
            if (movementSessionState == MovementSessionState.ShutDown)
            {
                Debug.LogWarning("MLMovementBehavior.EndMovementSession failed to end the movement session. Reason: Movement session was never started.");
                return;
            }

            if (forceEnd)
            {
                EndAllCollisions(CollisionType.All);
            }
            else
            {
                EndAllCollisions(CollisionType.Hard);
            }

            #if PLATFORM_LUMIN
            // Passing float.MaxValue if forceEnd is true to ensure movement ends with a Timeout result.
            MLResult result = MLMovement.End(sessionHandle, forceEnd ? float.MaxValue : Time.deltaTime, out sessionObject);
            if (result.IsOk || result.Result == MLResult.Code.Pending)
            {
                if (AllowCollision)
                {
                    objectRigidbody.position        = sessionObject.ObjectPosition;
                    objectRigidbody.rotation        = sessionObject.ObjectRotation.normalized;
                    objectRigidbody.velocity        = Vector3.zero;
                    objectRigidbody.angularVelocity = Vector3.zero;
                }
                else
                {
                    transform.position = sessionObject.ObjectPosition;
                    transform.rotation = sessionObject.ObjectRotation.normalized;
                }

                if (result.IsOk)
                {
                    sessionHandle        = UnityEngine.XR.MagicLeap.Native.MagicLeapNativeBindings.InvalidHandle;
                    movementSessionState = MovementSessionState.ShutDown;
                }
                else
                {
                    movementSessionState = MovementSessionState.PendingShutDown;
                }
            }
            else if (result.Result == MLResult.Code.Timeout)
            {
                hardCollisionMap.Clear();
                softCollisionMap.Clear();
                sessionHandle        = UnityEngine.XR.MagicLeap.Native.MagicLeapNativeBindings.InvalidHandle;
                movementSessionState = MovementSessionState.ShutDown;
            }
            else
            {
                Debug.LogErrorFormat("MLMovementBehavior.EndMovementSession failed to end the movement session, disabling script. Reason: {0}", result);
                enabled = false;
                return;
            }
            #endif
        }
Пример #2
0
        /// <summary>
        /// Starts a new movement session if a session was not already active.
        /// </summary>
        public void StartMovementSession()
        {
            if (movementSessionState != MovementSessionState.ShutDown)
            {
                Debug.LogWarning("MLMovementBehavior.StartMovementSession failed to start a new movement session. Reason: Movement session is still running.");
                return;
            }

            #if PLATFORM_LUMIN
            MLResult result;
            #endif

            sessionInteractionMode = InteractionMode;
            sessionInputDriverType = InputDriverType;

            originalOrientation = (transform.up.normalized == Vector3.up) ? Quaternion.identity : transform.rotation.normalized;

            #if PLATFORM_LUMIN
            sessionObject = new MLMovement.MovementObject()
            {
                ObjectPosition = transform.position,
                ObjectRotation = (transform.up.normalized == Vector3.up) ? transform.rotation.normalized : Quaternion.identity
            };
            #endif

            switch (sessionInteractionMode)
            {
            case MovementInteractionMode.ThreeDof:
            {
                    #if PLATFORM_LUMIN
                MLMovement.Settings3Dof dofSettings = new MLMovement.Settings3Dof()
                {
                    AutoCenter = this.AutoCenter
                };

                session3DofControls = new MLMovement.Controls3Dof()
                {
                    HeadposePosition = Camera.main.transform.position
                };

                if (sessionInputDriverType == MovementInputDriverType.Controller)
                {
                    session3DofControls.ControlRotation = (ControllerHandler.ConnectedController != null) ? ControllerHandler.ConnectedController.Orientation.normalized : Quaternion.identity;
                }
                else
                {
                    session3DofControls.ControlRotation = mainCamera.transform.rotation.normalized;
                }

                result = MLMovement.Start3Dof(in SettingsManager.Settings, in dofSettings, in session3DofControls, in sessionObject, out sessionHandle);

                if (!result.IsOk)
                {
                    Debug.LogErrorFormat("MLMovementBehavior.StartMovementSession failed to start a new 3dof movement session, disabling script. Reason: {0}", result);
                    enabled = false;
                    return;
                }
                    #endif

                break;
            }

            case MovementInteractionMode.SixDof:
            {
                    #if PLATFORM_LUMIN
                MLMovement.Settings6Dof dofSettings = new MLMovement.Settings6Dof()
                {
                    AutoCenter = this.AutoCenter
                };

                session6DofControls = new MLMovement.Controls6Dof()
                {
                    HeadposePosition = Camera.main.transform.position,
                    HeadposeRotation = Camera.main.transform.rotation.normalized,
                };

                if (sessionInputDriverType == MovementInputDriverType.Controller)
                {
                    session6DofControls.ControlPosition = (ControllerHandler.ConnectedController != null) ? ControllerHandler.ConnectedController.Position : Vector3.zero;
                    session6DofControls.ControlRotation = (ControllerHandler.ConnectedController != null) ? ControllerHandler.ConnectedController.Orientation.normalized : Quaternion.identity;
                }
                else
                {
                    session6DofControls.ControlPosition = mainCamera.transform.position;
                    session6DofControls.ControlRotation = mainCamera.transform.rotation.normalized;
                }

                result = MLMovement.Start6Dof(in SettingsManager.Settings, in dofSettings, in session6DofControls, in sessionObject, out sessionHandle);
                if (!result.IsOk)
                {
                    Debug.LogErrorFormat("MLMovementBehavior.StartMovementSession failed to start a new 6dof movement session, disabling script. Reason: {0}", result);
                    enabled = false;
                    return;
                }
                    #endif

                break;
            }

            default:
            {
                Debug.LogError("MLMovementBehavior.StartMovementSession failed to start a new movement session, disabling script. Reason: Invalid InteractionMode parameter.");
                enabled = false;
                return;
            }
            }

            movementSessionState = MovementSessionState.Running;
        }