/// <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 }
/// <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; }