1.鼠标转动
基类MouseLook,负责处理鼠标转向和准星是否锁定,这个比较简单
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
namespace UnityStandardAssets.Characters.FirstPerson
{
[Serializable]
public class MouseLook
{
public float XSensitivity = 2f; //x轴灵敏度
public float YSensitivity = 2f; //y轴灵敏地
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;//x和y轴的转动角度
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; //按下Esc取消锁定
}
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;
}
//个人感觉这个m_cursorIsLocked没有必要.....
}
Quaternion ClampRotationAroundXAxis(Quaternion q)//Clamp俯仰角
{
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