using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraScript : MonoBehaviour
{
public static CameraScript I;
public GameObject cameraHolder;
[SerializeField] private float lerpValue = 0.3f;
[SerializeField] private float lookSensitivity = 0.3f;
[SerializeField] private float scrollValue = 0.3f;
[SerializeField] private float closestDist = 1;
[SerializeField] private float furthestDist = 10;
[SerializeField] private float maxAngle = 85;
private Transform playerTransform;
private Vector3 lerpVal;
[SerializeField] private Vector3 offset;
private void Awake()
{
I = this;
}
// Start is called before the first frame update
void Start()
{
playerTransform = Move.Instance.playerModel.transform;
}
// Update is called once per frame
void Update()
{
Cursor.lockState = CursorLockMode.Locked;
// If moving up, make sure angle is below max angle, if moving down make sure its above.
if (Input.GetAxisRaw("Mouse Y") > 0)
if (WrapAngle(cameraHolder.transform.eulerAngles.x) + Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2 < maxAngle)
cameraHolder.transform.eulerAngles += new Vector3(Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2, 0, 0);
else
cameraHolder.transform.eulerAngles = new Vector3(maxAngle, cameraHolder.transform.eulerAngles.y, cameraHolder.transform.eulerAngles.z);
if (Input.GetAxisRaw("Mouse Y") < 0)
if (WrapAngle(cameraHolder.transform.eulerAngles.x) + Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2 > -maxAngle)
cameraHolder.transform.eulerAngles += new Vector3(Input.GetAxisRaw("Mouse Y") * lookSensitivity / 2, 0, 0);
else
cameraHolder.transform.eulerAngles = new Vector3(-maxAngle, cameraHolder.transform.eulerAngles.y, cameraHolder.transform.eulerAngles.z);
// Separate the vertical locking with horizontal looking.
cameraHolder.transform.eulerAngles += new Vector3(0, Input.GetAxisRaw("Mouse X") * lookSensitivity, 0);
cameraHolder.transform.eulerAngles = new Vector3(cameraHolder.transform.eulerAngles.x, cameraHolder.transform.eulerAngles.y, 0);
cameraHolder.transform.position = Vector3.Lerp(cameraHolder.transform.position, playerTransform.position + offset, lerpValue);
// If going up / going down
if (Input.mouseScrollDelta.y > 0)
{
// If the distance is greater than the closest distance allowed
if (Vector3.Distance(transform.position, cameraHolder.transform.position) > closestDist)
transform.position = Vector3.Slerp(transform.position, transform.position + Input.mouseScrollDelta.y * (cameraHolder.transform.position - transform.position).normalized, scrollValue);
else
transform.position = Vector3.Slerp(transform.position, transform.position + 1 * (transform.position - cameraHolder.transform.position).normalized, scrollValue);
}
if (Input.mouseScrollDelta.y < 0)
{
// If the distance is lower than the furthest distance allowed
if (Vector3.Distance(transform.position, cameraHolder.transform.position) < furthestDist)
transform.position = Vector3.Slerp(transform.position, transform.position + Input.mouseScrollDelta.y * (cameraHolder.transform.position - transform.position).normalized, scrollValue);
else
transform.position = Vector3.Slerp(transform.position, transform.position + 1 * (cameraHolder.transform.position - transform.position).normalized, scrollValue);
}
transform.LookAt(cameraHolder.transform);
}
private static float WrapAngle(float angle)
{
angle %= 360;
return angle > 180 ? angle - 360 : angle;
}
private static float UnwrapAngle(float angle)
{
if (angle >= 0)
return angle;
angle = -angle % 360;
return 360 - angle;
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawLine(cameraHolder.transform.position, transform.position);
}
}