using System.Collections; using System.Collections.Generic; using UnityEngine; public class FreeCamera : MonoBehaviour { public Camera freeCamera; public float movementSpeed = 5f; public float movementSpeedFaster = 20f; public float movementSpeedSlower = 2f; public float freeLookSensitivity = 5f; public float fieldOfView = 60f; [HideInInspector] public float clippingFarPlanes; public float zoomSensitivity = 10f; public float cameraRoll = 0f; private float movementSpeedDefault; //Saves the movement speed Original value. [HideInInspector] public float fieldOfViewDefault; [HideInInspector] public float clippingPlanesFarDefault; [HideInInspector] public float cameraRollDefault; private bool looking = false; private bool CanLook = false; private bool CameraRollMaxValue = false; private bool CameraRollNegativeMaxValue = false; private bool CameraIsMovingFaster; private bool CameraIsMovingSlower; [HideInInspector] public float newRotationX; [HideInInspector] public float newRotationY; public Vector2 pitchMinMax = new Vector2(-90, 90); // Έχουν οριστεί οι περιορισμοί σε -90 και 90 για πάνω και κάτω public float mouseSensitivity = 10; [HideInInspector] public float yaw; [HideInInspector] public float pitch; private static FreeCamera _instance; public static FreeCamera GetInstance() { return _instance; } private void Awake() { if (!_instance) { _instance = this; } clippingFarPlanes = freeCamera.farClipPlane; clippingPlanesFarDefault = clippingFarPlanes; } void Start() { movementSpeedDefault = movementSpeed; //Saves the movement speed value. cameraRollDefault = cameraRoll; fieldOfViewDefault = fieldOfView; } void Update() { UpdateCameraFieldOfView(); #region Move camera faster or Slower if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) && CameraIsMovingFaster) { movementSpeed = movementSpeedFaster; CameraIsMovingFaster = true; } else if (CameraIsMovingFaster) { movementSpeed = movementSpeedDefault; CameraIsMovingFaster = false; } if (Input.GetKey(KeyCode.LeftControl)) { movementSpeed = movementSpeedSlower; CameraIsMovingSlower = true; } else if (CameraIsMovingSlower) { movementSpeed = movementSpeedDefault; CameraIsMovingSlower = false; } #endregion #region WASD Navigation Camera Movement if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) { transform.position = transform.position + (transform.forward * movementSpeed * Time.unscaledDeltaTime); } if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { transform.position = transform.position + (-transform.right * movementSpeed * Time.unscaledDeltaTime); } if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) { transform.position = transform.position + (-transform.forward * movementSpeed * Time.unscaledDeltaTime); } if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) { transform.position = transform.position + (transform.right * movementSpeed * Time.unscaledDeltaTime); } #endregion #region Controller Input yaw = Input.GetAxis("Joystick Horizontal"); pitch = Input.GetAxis("Joystick Vertical"); if (pitch > 0) { transform.position = transform.position + (transform.forward * movementSpeed * Time.unscaledDeltaTime); } else if (pitch < 0) { transform.position = transform.position + (-transform.forward * movementSpeed * Time.unscaledDeltaTime); } if (yaw > 0) { transform.position = transform.position + (transform.right * movementSpeed * Time.unscaledDeltaTime); } else if (yaw < 0) { transform.position = transform.position + (-transform.right * movementSpeed * Time.unscaledDeltaTime); } #endregion #region Up & Down Camera Movement if (Input.GetKey(KeyCode.Q)) { transform.position = transform.position + (-transform.up * movementSpeed * Time.unscaledDeltaTime); } if (Input.GetKey(KeyCode.E)) { transform.position = transform.position + (transform.up * movementSpeed * Time.unscaledDeltaTime); } #endregion newRotationX = transform.localEulerAngles.y; #region Camera roll if (Input.GetKey(KeyCode.G) && CameraRollMaxValue == false) { cameraRoll -= 15 * Time.unscaledDeltaTime; transform.localEulerAngles = new Vector3(newRotationY, newRotationX, cameraRoll); PhotomodeManager.GetInstance().CanHoldDownSlider = false; } else if (Input.GetKey(KeyCode.F) && CameraRollNegativeMaxValue == false) { cameraRoll += 15 * Time.unscaledDeltaTime; transform.localEulerAngles = new Vector3(newRotationY, newRotationX, cameraRoll); PhotomodeManager.GetInstance().CanHoldDownSlider = false; } else { PhotomodeManager.GetInstance().CanHoldDownSlider = true; } #region Camera roll Max values events if (cameraRoll <= -90) { CameraRollMaxValue = true; CameraRollNegativeMaxValue = false; } else { CameraRollMaxValue = false; } if (cameraRoll >= 90) { CameraRollMaxValue = false; CameraRollNegativeMaxValue = true; } else { CameraRollNegativeMaxValue = false; } #endregion #endregion if (looking) { // Αντιστροφή του άξονα Y για την κίνηση του ποντικιού newRotationY = transform.localEulerAngles.x - Input.GetAxis("Mouse Y") * freeLookSensitivity; // Αντιστροφή του άξονα Y // Περιορισμός του pitch στις -90 και 90 μοίρες if (newRotationY > 180) newRotationY -= 360; // Για να είναι ο περιορισμός πιο ακριβής newRotationY = Mathf.Clamp(newRotationY, pitchMinMax.x, pitchMinMax.y); // Περιορισμός της κίνησης newRotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * freeLookSensitivity; // Κίνηση στον άξονα X transform.localEulerAngles = new Vector3(newRotationY, newRotationX, cameraRoll); } if (Input.GetKeyDown(KeyCode.Mouse1)) { StartLookingAround(); } else if (Input.GetKeyUp(KeyCode.Mouse1)) { StopLookingAround(); } #region Controller Camera look around Input if (InputControlManager.Getinstance().IsUsingJoystick) { // Αντιστροφή του άξονα Y για το joystick newRotationY = transform.localEulerAngles.x - Input.GetAxis("Joystick Y") * freeLookSensitivity; // Αντιστροφή του άξονα Y if (newRotationY > 180) newRotationY -= 360; // Για να είναι ο περιορισμός πιο ακριβής newRotationY = Mathf.Clamp(newRotationY, pitchMinMax.x, pitchMinMax.y); // Περιορισμός της κίνησης newRotationX = transform.localEulerAngles.y + Input.GetAxis("Joystick X") * freeLookSensitivity; // Κίνηση στον άξονα X transform.localEulerAngles = new Vector3(newRotationY, newRotationX, cameraRoll); } #endregion } public void StartLookingAround() { looking = true; Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; } public void StopLookingAround() { looking = false; Cursor.visible = true; Cursor.lockState = CursorLockMode.None; } public void UpdateCameraFieldOfView() { freeCamera.fieldOfView = fieldOfView; } }