diff options
Diffstat (limited to 'UnitySA.Characters.FirstPerson/MLook.cs')
-rw-r--r-- | UnitySA.Characters.FirstPerson/MLook.cs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/UnitySA.Characters.FirstPerson/MLook.cs b/UnitySA.Characters.FirstPerson/MLook.cs new file mode 100644 index 0000000..ce78022 --- /dev/null +++ b/UnitySA.Characters.FirstPerson/MLook.cs @@ -0,0 +1,111 @@ +using System; +using UnityEngine; + +namespace UnitySA.Characters.FirstPerson; + +[Serializable] +public class MLook +{ + public float XSensitivity = 2f; + + public float YSensitivity = 2f; + + public bool clampVerticalRotation = true; + + public float MinimumX = -90f; + + public float MaximumX = 90f; + + public bool smooth; + + public float smoothTime = 5f; + + public bool lockCursor = true; + + private Quaternion m_CharacterTargetRot; + + private Quaternion m_CameraTargetRot; + + private bool m_cursorIsLocked = true; + + public void Init(Transform character, Transform camera) + { + m_CharacterTargetRot = character.localRotation; + m_CameraTargetRot = camera.localRotation; + } + + public void LookRotation(Transform character, Transform camera) + { + float y = Input.GetAxis("Mouse X") * XSensitivity; + float num = Input.GetAxis("Mouse Y") * YSensitivity; + m_CharacterTargetRot *= Quaternion.Euler(0f, y, 0f); + m_CameraTargetRot *= Quaternion.Euler(0f - num, 0f, 0f); + if (clampVerticalRotation) + { + m_CameraTargetRot = ClampRotationAroundXAxis(m_CameraTargetRot); + } + if (smooth) + { + character.localRotation = Quaternion.Slerp(character.localRotation, m_CharacterTargetRot, smoothTime * Time.deltaTime); + camera.localRotation = Quaternion.Slerp(camera.localRotation, m_CameraTargetRot, smoothTime * Time.deltaTime); + } + else + { + character.localRotation = m_CharacterTargetRot; + camera.localRotation = m_CameraTargetRot; + } + UpdateCursorLock(); + } + + public void SetCursorLock(bool value) + { + lockCursor = value; + if (!lockCursor) + { + Cursor.lockState = CursorLockMode.None; + Cursor.visible = true; + } + } + + public void UpdateCursorLock() + { + if (lockCursor) + { + InternalLockUpdate(); + } + } + + private void InternalLockUpdate() + { + if (Input.GetKeyUp(KeyCode.Escape)) + { + m_cursorIsLocked = false; + } + else if (Input.GetMouseButtonUp(0)) + { + m_cursorIsLocked = true; + } + 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 = 1f; + float value = 114.59156f * Mathf.Atan(q.x); + value = Mathf.Clamp(value, MinimumX, MaximumX); + q.x = Mathf.Tan((float)Math.PI / 360f * value); + return q; + } +} |