本文使用的开发工具为unity2018,完整项目下载地址:https://download.csdn.net/download/lj820348789/35571820
一、最终效果
二、实现过程
1、罗盘的实现原理:
通过触摸点的屏幕坐标与罗盘中心点的屏幕坐标相减,得到方向向量,通过这个向量与向量(0,1)获得两向量夹角,这个夹角就是罗盘的旋转值,同时也是相机朝向在水平方向投影的偏移值,由此就可以的得到角色位移的方向,代码片段如下:
//得到相对坐标
Vector2 relativePos = new Vector2(curPos.x - m_uiPosInScreen.x, curPos.y - m_uiPosInScreen.y);
//计算距离中心位置
float dis2Center_pingfang = relativePos.sqrMagnitude;
if (dis2Center_pingfang <= 5625)
{
m_rotateImageRT.localScale = new Vector3(0.5f, 0.5f, 1.0f);
m_fixedBgImageRT.localScale = new Vector3(0.5f, 0.5f, 1.0f);
}
else
{
m_rotateImageRT.localScale = new Vector3(1.0f, 1.0f, 1.0f);
m_fixedBgImageRT.localScale = new Vector3(1.0f, 1.0f, 1.0f);
}
//计算旋转值
float angle = Vector2.Angle(relativePos, new Vector2(0, 1));
if(relativePos.x > 0)
{
angle = 360 - angle;
}
m_curRotateAngle = angle;
//根据相机朝向与轮盘角度计算角色的移动方向
Vector3 camForward = m_CameraTr.forward;
Vector3 moveForward = Quaternion.AngleAxis(-m_curRotateAngle, Vector3.up) * camForward;
moveForward.y = 0;
Vector3 modelOffsetPos = m_Model.Move(moveForward.normalized, 0.1f);
Vector3 camCurPos = m_CameraTr.position;
m_CameraTr.position = camCurPos + modelOffsetPos;
2、镜头旋转的实现原理:
代码实现是通过最终角度(角度a+增加角度b)和角色位置,实时计算出相机的位置(角色.positon -相对z轴的旋转向量*距离),以及相机的旋转值(如图角度a),代码片段如下:
// 设置相机旋转,yDeg, xDeg分别为累计角度
desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
currentRotation = transform.rotation;
rotation = desiredRotation;
transform.rotation = rotation;
//变焦最小/最大
desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
//平滑变焦
currentDistance = desiredDistance;
position = target.position - (rotation * Vector3.forward * currentDistance);
transform.position = position;