预期效果
长按鼠标右键并移动鼠标实现视角旋转,松开鼠标右键还原;滑动鼠标滚轮实现视角缩放。
实现
记录初始视角
xCurrentAngle = transCam.eulerAngles.y;
yCurrentAngle = transCam.eulerAngles.x;
zCurrentAngle = transCam.eulerAngles.z;
xOriginAngle = xCurrentAngle;
yOriginAngle = yCurrentAngle;
zOriginAngle = zCurrentAngle;
生成焦点物体
if (!objFocus)
{
objFocus = new GameObject("Focus");
}
设置焦点位置
有目标点
objFocus.transform.SetPositionAndRotation(trans.position, trans.rotation);
transFocus = objFocus.transform;
disCurrent = Vector3.Distance(transCam.position, transFocus.position);
无目标点
Vector3 posFocus = transCam.position + transCam.forward * disConstant;
objFocus.transform.SetPositionAndRotation(posFocus, transCam.rotation);
transFocus = objFocus.transform;
disCurrent = disConstant;
限制旋转角度
if (maxAngle < minAngle)
{
float angleInterim = minAngle;
minAngle = maxAngle;
maxAngle = angleInterim;
}
if (angle < -360)
{
angle += 360;
}
if (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp(angle, minAngle, maxAngle);
限制缩放距离
if (maxDis < minDis)
{
float disInterim = minDis;
minDis = maxDis;
maxDis = angleInterim;
}
return Mathf.Clamp(dis, minDis, maxDis);
旋转角度
xCurrentAngle += Input.GetAxis("Mouse X") * speedRotateH;
yCurrentAngle -= Input.GetAxis("Mouse Y") * speedRotateV;
xCurrentAngle = ClampAngle(xCurrentAngle, minAngleH, maxAngleH);
yCurrentAngle = ClampAngle(yCurrentAngle, minAngleV, maxAngleV);
还原角度
xCurrentAngle = xOriginAngle;
yCurrentAngle = yOriginAngle;
缩放距离
offestZoom = Input.GetAxis("Mouse ScrollWheel"));
if (speedZoom > 0)
{
disCurrent -= offestZoom * speedZoom;
}
else
{
disCurrent += offestZoom * speedZoom;
}
disCurrent = ClampDis(disCurrent, minDis, maxDis);
旋转和缩放
var rotation = Quaternion.Euler(yCurrentAngle, xCurrentAngle, zCurrentAngle);
var position = rotation * new Vector3(0, 0, -disCurrent) + transFocus.position;
if (isSmooth)
{
transCam.SetPositionAndRotation(Vector3.Lerp(transCam.position, position, Time.deltaTime * 10), Quaternion.Lerp(transCam.rotation, rotation, Time.deltaTime * 10));
}
else
{
transCam.SetPositionAndRotation(position, rotation);
}