Files
2025-05-29 22:31:40 +03:00

240 lines
8.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}