Files
RoomAwareVR/Assets/Fragilem17/Portals for VR/Demo/Scripts/PortalExampleCameraController.cs
2025-05-26 00:46:28 +02:00

108 lines
4.0 KiB
C#

using System;
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
namespace Fragilem17.MirrorsAndPortals
{
public class PortalExampleCameraController : MonoBehaviour
{
private Vector2 _rotation = Vector2.zero;
public float Speed = 1;
public float MouseSpeed = 4;
public Transform lookTarget;
public Transform moveTarget;
#if ENABLE_INPUT_SYSTEM
public InputAction moveAction;
public InputAction xrControllerAction;
public InputAction rotateAction;
[Tooltip("Action to toggle between free look and editor cursor")]
public InputAction toggleMouseLookAction;
private void OnEnable()
{
moveAction.Enable();
xrControllerAction.Enable();
rotateAction.Enable();
toggleMouseLookAction.Enable();
}
private void OnDisable()
{
moveAction.Disable();
xrControllerAction.Disable();
rotateAction.Disable();
toggleMouseLookAction.Disable();
}
#endif
void Update()
{
#if ENABLE_LEGACY_INPUT_MANAGER && !ENABLE_INPUT_SYSTEM
moveTarget.position += lookTarget.forward * Time.deltaTime * Input.GetAxis("Vertical") * Speed;
moveTarget.position += lookTarget.right * Time.deltaTime * Input.GetAxis("Horizontal") * Speed;
if (!Cursor.visible && Cursor.lockState == CursorLockMode.Locked)
{
_rotation.y = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * MouseSpeed * 0.2f;
_rotation.x = transform.localEulerAngles.x + -Input.GetAxis("Mouse Y") * MouseSpeed * 0.2f;
//_rotation.x = Mathf.Clamp(_rotation.x, -40f, 40f);
// rotate z towards 0
float deltaZ = 0 - transform.localEulerAngles.z;
if (transform.localEulerAngles.z > 180f)
{
// rotate z towards 360
deltaZ = 360 - transform.localEulerAngles.z;
}
transform.localEulerAngles = new Vector3(_rotation.x, _rotation.y, transform.localEulerAngles.z + (deltaZ * 0.04f));
}
if (Input.GetMouseButton(0) || Input.GetMouseButton(1))
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
#endif
#if ENABLE_INPUT_SYSTEM
moveTarget.position += lookTarget.forward * Time.deltaTime * xrControllerAction.ReadValue<Vector2>().y * Speed;
moveTarget.position += lookTarget.right * Time.deltaTime * xrControllerAction.ReadValue<Vector2>().x * Speed;
moveTarget.position += lookTarget.forward * Time.deltaTime * moveAction.ReadValue<Vector3>().z * Speed;
moveTarget.position += lookTarget.right * Time.deltaTime * moveAction.ReadValue<Vector3>().x * Speed;
moveTarget.position += lookTarget.up * Time.deltaTime * moveAction.ReadValue<Vector3>().y * Speed;
if (!Cursor.visible && Cursor.lockState == CursorLockMode.Locked)
{
_rotation.y = transform.localEulerAngles.y + rotateAction.ReadValue<Vector2>().x * Time.deltaTime * MouseSpeed;
_rotation.x = transform.localEulerAngles.x + -rotateAction.ReadValue<Vector2>().y * Time.deltaTime * MouseSpeed;
//_rotation.x = Mathf.Clamp(_rotation.x, -40f, 40f);
// rotate z towards 0
float deltaZ = 0 - transform.localEulerAngles.z;
if (transform.localEulerAngles.z > 180f)
{
// rotate z towards 360
deltaZ = 360 - transform.localEulerAngles.z;
}
transform.localEulerAngles = new Vector3(_rotation.x, _rotation.y, transform.localEulerAngles.z + (deltaZ * 0.04f));
}
if (toggleMouseLookAction.ReadValue<float>() > 0)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
#endif
}
}
}