Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
DMD2542-Project003-RaycastingRepo-JacobTomassi/DMD2542-Project003-Raycasting-JacobTomassi/Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/MouseLook.cs
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
115 lines (95 sloc)
3.39 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using UnityEngine; | |
using UnityStandardAssets.CrossPlatformInput; | |
namespace UnityStandardAssets.Characters.FirstPerson | |
{ | |
[Serializable] | |
public class MouseLook | |
{ | |
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 yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity; | |
float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity; | |
m_CharacterTargetRot *= Quaternion.Euler (0f, yRot, 0f); | |
m_CameraTargetRot *= Quaternion.Euler (-xRot, 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) | |
{//we force unlock the cursor if the user disable the cursor locking helper | |
Cursor.lockState = CursorLockMode.None; | |
Cursor.visible = true; | |
} | |
} | |
public void UpdateCursorLock() | |
{ | |
//if the user set "lockCursor" we check & properly lock the cursos | |
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; | |
} | |
} | |
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; | |
} | |
} | |
} |