using System.Collections; using System.Collections.Generic; using UnityEngine; using Valve.VR; public class VRController : MonoBehaviour { public float Gravity = 30.0f; public float Sensitivity = 0.1f; public float MaxSpeed = 1.0f; public float RotateIncrement = 90; public SteamVR_Action_Boolean RotateLeftPress = null; public SteamVR_Action_Boolean RotateRightPress = null; public SteamVR_Action_Boolean MovePress = null; public SteamVR_Action_Vector2 MoveValue = null; private float speed = 0.0f; private CharacterController CharacterController = null; private Transform CameraRig = null; private Transform Head = null; private void Awake() { CharacterController = GetComponent(); //MovePress = SteamVR_Actions.default_TouchpadKlick; //MoveValue = SteamVR_Actions.default_TouchpadPosition; } void Start() { CameraRig = SteamVR_Render.Top().origin; Head = SteamVR_Render.Top().head; } void Update() { // HandleHead(); HandleHeight(); CalculateMovement(); SnapRotation(); } //private void HandleHead() //{ // // Store current // Vector3 oldPosition = CameraRig.position; // Quaternion oldRotation = CameraRig.rotation; // // Rotation // transform.eulerAngles = new Vector3(0.0f, Head.rotation.eulerAngles.y, 0.0f); // // Restore // CameraRig.position = oldPosition; // CameraRig.rotation = oldRotation; //} private void HandleHeight() { // Get the head in local space float headHeight = Mathf.Clamp(Head.localPosition.y, 1, 2); CharacterController.height = headHeight; // Cut in half Vector3 newCenter = Vector3.zero; newCenter.y = CharacterController.height / 2; newCenter.y += CharacterController.skinWidth; // Move Capsule in local space newCenter.x = Head.localPosition.x; newCenter.z = Head.localPosition.z; //// Rotate //newCenter = Quaternion.Euler(0, -transform.eulerAngles.y, 0) * newCenter; // Apply CharacterController.center = newCenter; } private void CalculateMovement() { // Figure out movement orientation Vector3 orientationEuler = new Vector3(0, Head.eulerAngles.y, 0); Quaternion orientation = Quaternion.Euler(orientationEuler); //Quaternion orientation = CalculateOrientation(); Vector3 movement = Vector3.zero; // If not moving if (MovePress.GetStateUp(SteamVR_Input_Sources.Any)) { speed = 0; } // If button pressed if (MovePress.state) { // Add, clamp speed += MoveValue.axis.y * Sensitivity; speed = Mathf.Clamp(speed, -MaxSpeed, MaxSpeed); // Orientation movement += orientation * (speed * Vector3.forward); } // Gravcity movement.y -= Gravity * Time.deltaTime; // Apply CharacterController.Move(movement * Time.deltaTime); } //private Quaternion CalculateOrientation() //{ // float rotation = Mathf.Atan2(MoveValue.axis.x, MoveValue.axis.y); // rotation *= Mathf.Rad2Deg; // Vector3 orientationEuler = new Vector3(0, Head.eulerAngles.y+rotation, 0); // return Quaternion.Euler(orientationEuler); //} private void SnapRotation() { float snapValue = 0.0f; if (RotateLeftPress.GetStateDown(SteamVR_Input_Sources.LeftHand) || RotateLeftPress.GetStateDown(SteamVR_Input_Sources.RightHand)) { snapValue = -Mathf.Abs(RotateIncrement); } if (RotateRightPress.GetStateDown(SteamVR_Input_Sources.LeftHand) || RotateRightPress.GetStateDown(SteamVR_Input_Sources.RightHand)) { snapValue = Mathf.Abs(RotateIncrement); } transform.RotateAround(Head.position, Vector3.up, snapValue); } }