summaryrefslogtreecommitdiff
path: root/UnitySA.Characters.FirstPerson/MLook.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2024-03-13 11:00:58 +0800
committerchai <215380520@qq.com>2024-03-13 11:00:58 +0800
commit6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch)
treeb38119d2acf0a982cb67e381f146924b9bfc3b3f /UnitySA.Characters.FirstPerson/MLook.cs
+init
Diffstat (limited to 'UnitySA.Characters.FirstPerson/MLook.cs')
-rw-r--r--UnitySA.Characters.FirstPerson/MLook.cs111
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;
+ }
+}