建立相机类
实现视角随鼠标移动 并实现玩家左右旋转随相机左右方向
建立Camera物体 放置于玩家物体下 设置相对位置position为(0,2,-0.2)
设置Tag为MainCamera主摄像机
定义方法--获取鼠标输入
定义变量:
{
public Vector2 mouseLookSensitivity=new Vector2(5,5);//鼠标灵敏度
public Vector2 rotationXLimit = new Vector2(87, -87);//绕X轴旋转角度
public Vector2 rotationYLimit = new Vector2(-360, 360);//绕Y轴旋转角度
public Vector3 positionOffset = new Vector3(0, 2,-0.2f);//相机相对位置
定义方法:
用parameter脚本调用其中的二维变量inputSmoothLook,此变量在start函数中已用鼠标的GetAxisRaw函数赋值
注意:要将 currentMouseLook.y *= -1;
想要视角绕X轴向下旋转,向下看,即x值增大;那么鼠标输入的y方向(鼠标上下)就要向负方向 即x减小。所以倒置鼠标输入y方向。
private void GetMouseLook()
{
currentMouseLook.x = parameter.inputSmoothLook.x;//沿X轴方向
currentMouseLook.y = parameter.inputSmoothLook.y;//沿y轴方向
currentMouseLook.x *= mouseLookSensitivity.x;
currentMouseLook.y *= mouseLookSensitivity.y;
currentMouseLook.y *= -1;
}
将鼠标旋转角度交给视角旋转角度变量
currentMouseLook.x是鼠标沿x轴方向的移动,将之交给y_Angle,y_Angle即为真实视角的绕y轴旋转角度,即左右旋转
因此:
y_Angle += currentMouseLook.x;
x_Angle += currentMouseLook.y;
随后在Update方法中调用此方法
private void UpdateInput()
{
//若鼠标输入为0
if (parameter.inputSmoothLook == Vector2.zero) return;
GetMouseLook();
y_Angle += currentMouseLook.x;
x_Angle += currentMouseLook.y;
//限制左右旋转
y_Angle = y_Angle < -360 ? y_Angle += 360 : y_Angle;
y_Angle = y_Angle > 360 ? y_Angle -= 360 : y_Angle;
y_Angle = Mathf.Clamp(y_Angle,rotationYLimit.x,rotationYLimit.y);
//限制上下旋转
x_Angle = x_Angle < -360 ? x_Angle += 360 : x_Angle;
x_Angle = x_Angle > 360 ? x_Angle -= 360 : x_Angle;
x_Angle = Mathf.Clamp(x_Angle, -rotationXLimit.x, -rotationXLimit.y);
}
将真实视角旋转(y_Angle、x_Angle)交给玩家和玩家下所挂的camera
用Quaternion.AngleAxis函数
Quaternion:四元数,这个在Unity中基本就是用于计算方位、旋转的;
AngleAxis:这个就表示围绕一个轴,进行指定的角度旋转
即为:指定一个轴,围绕该轴旋转指定的角度,得到一个新的旋转结果;
其中,将y_Angle 即绕y轴旋转角度 ,交给玩家方向旋转角度,实现玩家左右旋转
并锁定玩家沿x轴方向的旋转,因为玩家身体朝向只需绕y轴,不需要绕x轴
再将x_Angle交给camera,实现相机的上下旋转
鼠标向下移动 因倒置 所以currentMouse.y为正值 x_Angle为正值并叠加增大,交给Quaternion.AngleAxis函数,x_Angle向正增大,即在x轴右方向沿逆时针旋转,即实现camera视角向下旋转。
在LateUpdate方法中实现此功能
private void LateUpdate()
{
//绕y轴旋转(左右) 将旋转角交给父物体 即玩家 实现玩家左右旋转
Quaternion xQuaternion = Quaternion.AngleAxis(y_Angle,Vector3.up);//Vector3.up指y轴 即绕y轴进行旋转
Quaternion yQuaternion = Quaternion.AngleAxis(0, Vector3.left);
m_Transform.parent.rotation= xQuaternion*yQuaternion;
yQuaternion = Quaternion.AngleAxis(x_Angle,Vector3.right);
m_Transform.rotation = xQuaternion * yQuaternion;
}