240 lines
8.3 KiB
C#
240 lines
8.3 KiB
C#
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;
|
||
}
|
||
}
|