using System; using System.Collections; using System.Collections.Generic; using Unity.XR.CoreUtils; using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; [RequireComponent( typeof(ActionBasedContinuousMoveProvider), typeof(ActionBasedContinuousTurnProvider), typeof(ActionBasedSnapTurnProvider))] public class ThirdPersonTeleportController : MonoBehaviour { public XROrigin xrOrigin; private ActionBasedContinuousMoveProvider _continuousMoveProvider; private ActionBasedContinuousTurnProvider _continuousTurnProvider; private ActionBasedSnapTurnProvider _snapTurnProvider; public GameObject cameraContainer; public bool switchToContinuous; private bool _lastControllerMoveStatus; private void Awake() { _continuousMoveProvider = GetComponent(); _continuousTurnProvider = GetComponent(); _snapTurnProvider = GetComponent(); } void Update() { if (StartedMoving()) { Debug.Log("Started Moving"); cameraContainer.transform.parent = null; cameraContainer.transform.position = xrOrigin.transform.position; //Switch to continuous turn while remote controlling. if (switchToContinuous) { _continuousTurnProvider.enabled = true; _snapTurnProvider.enabled = false; } } if (StoppedMoving()) { Debug.Log("Stopped Moving"); cameraContainer.transform.SetParent(xrOrigin.transform); var originTransform = xrOrigin.transform; cameraContainer.transform.position = originTransform.position; cameraContainer.transform.rotation = originTransform.rotation; if (switchToContinuous) { _continuousTurnProvider.enabled = false; _snapTurnProvider.enabled = true; } } } private bool StartedMoving() { var controllerStatus = GetControllerStatus(); if (controllerStatus && _lastControllerMoveStatus == false) { _lastControllerMoveStatus = true; return true; } return false; } private bool StoppedMoving() { var controllerStatus = GetControllerStatus(); if (_lastControllerMoveStatus && controllerStatus == false) { _lastControllerMoveStatus = false; return true; } _lastControllerMoveStatus = controllerStatus; return false; } private bool GetControllerStatus() { return _continuousMoveProvider.leftHandMoveAction.action.inProgress || _continuousMoveProvider.rightHandMoveAction.action.inProgress; } }