通过update方法记录变化量然后通过坐标换算移动摄像机
一.获取上一帧到当前帧鼠标位移变化量,计算过相机从上一针位置到当前帧位置移动的距离
/// <summary>
/// 计算上一帧到当前帧移动距离
/// </summary>
/// <param name="moveDetla"></param>
/// <returns></returns>
bool isCameraMove(out Vector3 moveDetla)
{
moveDetla = Vector3.zero;
if (Input.GetMouseButtonDown(0))
{
setBeginState();
}
else if (Input.GetMouseButton(0))
{
Debug.DrawLine(cameraRay.origin, cameraRay.origin + cameraRay.direction * 50, Color.red);
Vector3 curMousePos = getMouseWorldPos();
Vector3 detla = curMousePos - curTouchPos;
if (detla.sqrMagnitude > 0)
{
Vector3 temp = dragCamera.ScreenToWorldPoint(curMousePos);
onToutch(temp);
moveDetla = dragCamera.ScreenToWorldPoint(startTouchPos) - temp;
//计算过相机从上一针位置到当前帧位置移动的位置
cameraTargetPos = cameraOriginPos + moveDetla;
curDragComeraPos = dragCamera.transform.position;
LaunchCameraMove();
// moveDetla = temp - dragCamera.ScreenToWorldPoint(startTouchPos);
curTouchPos = curMousePos;
return true;
}
}
return false;
}
二.实现摄像机移动阻尼和曲线移动派生类CameraDragSmoothDamp和CameraDragByCurve
重写CameraDragSmoothDamp的OnCameraMove()实现摄像机阻尼运动效果
protected override void OnCameraMove()
{
base.OnCameraMove();
if (!isLaunchMove)
{
return;
}
Vector3 result =
Vector3.SmoothDamp(dragCamera.transform.position, cameraTargetPos, ref curVelocity, moveTime);
if (curVelocity == Vector3.zero)
{
isLaunchMove = false;
}
SetCameraPos(result);
}
重写CameraDragByCurve的OnCameraMove()实现摄像机曲线运动效果
protected override void OnCameraMove()
{
base.OnCameraMove();
if (Curve==null)
{
return;;
}
if (!isLaunchMove)
{
return;
}