using System; using UnityEngine; using Cinemachine; public class CameraManager : MonoBehaviour { public InputReader inputReader; public Camera mainCamera; public CinemachineFreeLook freeLookVCam; private bool _isRMBPressed; [SerializeField, Range(1f, 5f)] private float speed = default; public void SetupProtagonistVirtualCamera(Transform target) { freeLookVCam.Follow = target; freeLookVCam.LookAt = target; } private void OnEnable() { inputReader.cameraMoveEvent += OnCameraMove; inputReader.enableMouseControlCameraEvent += OnEnableMouseControlCamera; inputReader.disableMouseControlCameraEvent += OnDisableMouseControlCamera; } private void OnDisable() { inputReader.cameraMoveEvent -= OnCameraMove; inputReader.enableMouseControlCameraEvent -= OnEnableMouseControlCamera; inputReader.disableMouseControlCameraEvent -= OnDisableMouseControlCamera; } private void OnEnableMouseControlCamera() { _isRMBPressed = true; Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; } private void OnDisableMouseControlCamera() { _isRMBPressed = false; Cursor.lockState = CursorLockMode.None; Cursor.visible = true; // when mouse control is disabled, the input needs to be cleared // or the last frame's input will 'stick' until the action is invoked again freeLookVCam.m_XAxis.m_InputAxisValue = 0; freeLookVCam.m_YAxis.m_InputAxisValue = 0; } private void OnCameraMove(Vector2 cameraMovement, bool isDeviceMouse) { if (isDeviceMouse && !_isRMBPressed) return; freeLookVCam.m_XAxis.m_InputAxisValue = cameraMovement.x * Time.smoothDeltaTime * speed; freeLookVCam.m_YAxis.m_InputAxisValue = cameraMovement.y * Time.smoothDeltaTime * speed; } }