using System; using UnityEngine; using UnityStandardAssets.CrossPlatformInput; [Serializable] public class MouseLookHelper { 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; private Quaternion m_CharacterTargetRot; private Quaternion m_CameraTargetRot; public void Init(Transform character, Transform camera) { this.m_CharacterTargetRot = character.localRotation; this.m_CameraTargetRot = camera.localRotation; } public void LookRotation(Transform character, Transform camera) { float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * this.XSensitivity; float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * this.YSensitivity; this.m_CharacterTargetRot *= Quaternion.Euler(0f, yRot, 0f); this.m_CameraTargetRot *= Quaternion.Euler(-xRot, 0f, 0f); if (this.clampVerticalRotation) { this.m_CameraTargetRot = this.ClampRotationAroundXAxis(this.m_CameraTargetRot); } if (this.smooth) { character.localRotation = Quaternion.Slerp(character.localRotation, this.m_CharacterTargetRot, this.smoothTime * Time.deltaTime); camera.localRotation = Quaternion.Slerp(camera.localRotation, this.m_CameraTargetRot, this.smoothTime * Time.deltaTime); } else { character.localRotation = this.m_CharacterTargetRot; camera.localRotation = this.m_CameraTargetRot; } } 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, this.MinimumX, this.MaximumX); q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angleX); return q; } }