60 lines
2.0 KiB
C#
60 lines
2.0 KiB
C#
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;
|
|
}
|
|
}
|