You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class FPSMouseLook {
public float xSensitivity = 2f;
public float ySensitivity = 2f;
public bool clampVerticalRotation = true;
public bool clampHorizontalRotation = true;
public float minimumX = -90F;
public float minimumY = -90F;
public float maximumX = 90F;
public float maximumY = 90F;
public bool smooth = false;
public float smoothTime = 2f;
public bool lockCursor = true;
public GameObject player;
private Transform m_camera;
private Transform m_character;
private Quaternion m_characterRot;
private Quaternion m_cameraRot;
private bool m_cursorIsLocked = true;
public void Init(Transform character, Transform camera)
{
m_character = character;
m_camera = camera;
m_characterRot = character.localRotation;
m_cameraRot = camera.localRotation;
UpdateCursorLock();
}
public void LookRotation()
{
float yRot = Input.GetAxis("Mouse X") * xSensitivity;
float xRot = Input.GetAxis("Mouse Y") * ySensitivity;
m_characterRot *= Quaternion.Euler(0f, yRot, 0f);
m_cameraRot *= Quaternion.Euler(-xRot, 0f, 0f);
if (clampVerticalRotation)
m_cameraRot = ClampRotationAroundXAxis(m_cameraRot);
if (smooth)
{
m_character.localRotation = Quaternion.Lerp(m_character.localRotation, m_characterRot,
smoothTime * Time.deltaTime);
m_camera.localRotation = Quaternion.Lerp(m_camera.localRotation, m_cameraRot,
smoothTime * Time.deltaTime);
}
else
{
m_character.localRotation = m_characterRot;
//m_camera.localrotation = m_characterRot;
m_camera.localRotation = m_cameraRot;
}
}
public void UpdateCursorLock()
{
if (m_cursorIsLocked)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else if (!m_cursorIsLocked)
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
private Quaternion ClampRotationAroundXAxis(Quaternion q)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1.0f;
float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan(q.x);
angleX = Mathf.Clamp(angleX, minimumX, maximumX);
q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX);
return q;
}
}