相机拖动功能---带有缓动惯性效果

相机拖动功能—带有缓动惯性效果

最近有需求是实现相机拖动功能,拖动之后还要相机带有惯性效果慢慢的停下。本人才疏学浅,实现不了,但是在网络上搜索到了一篇,具体在哪忘记了,特此记录一下, 供以后学习和复习。因为需求原因我稍加了改进,又不对的地方望大神们指出。

代码如下

要将相机调成正交模式使用

private float x;
private float y;
private float cameraHalfWidth;

//区域的X方向最小值
public float minPosX;
//区域的X方向最大值
public float maxPosX;
//区域的Y方向最小值
public float minPosY;
//区域的Y方向最大值
public float maxPosY;
//速度衰减速率
public float decelerationRate = 0.1f
//上次鼠标位置
Vector2 prevMousePos = Vector3.zero;
//滑动结束时的瞬时速度
Vector3 Speed = Vector3.zero;
//每帧偏差
Vector3 offset=Vector3.zero;

//摄像机
public Camera m_camera;

void Update()
{
   HandleMoveInput();
}
//输入移动的方法
private void HandleMoveInput()
{
   cameraHalfWidth=m_camera.orthographicSize*((float)Screen.width/Screen.heght);
   //按下时记录位置
   if(Input.GetMouseButtonDown(0))
   {
     prevMousePos = Input.mousePosition;
   }
   //移动时更新位置
   if(Input.GetMouseButton(0))
   {
     //当前鼠标的屏幕坐标系
     Vector3 curMousePosition = Input.mousePosition;
     //偏差值
     offset = m_camera.ScreenToWorldPoint(curMousePosition) -
     m_camera.ScreenToWorldPoint(prevMousePos); 
     //瞬时速度
     Speed = offset / Time.deltaTime;
   }
   else  //最后递减至停止
   {
     Speed *= Mathf.Pow(decelerationRate , Time.deltaTime);
     if(Mathf.Abs(Vector3.Magnitude(Speed)) < 1)
     {
        Speed = Vector3.zero;
     }
   }
   Move(Speed);
}
//限制移动时不会移出规定区域
public void Move(Vector3 speed)
{
  if(Vector3.Magnitude(Speed) == 0)
  {
    return;
  }
  else
  {
  //限制移动,保证不会移出规定范围
    m_camera.transform.position -= speed * Time.deltaTime;
    x = Mathf.Clamp(m_camera.transform.position.x, minPosX + cameraHalfWidth, maxPosX - cameraHalfWidth);
    y = Mathf.Clamp(m_camera.transform.position.y, minPosY + m_camera.orthographicSize, maxPosY - m_camera.orthographicSize); 
    
    transform.position = new Vector3(x, y, transform.position.z);      
  }
}

//这个方法可以画出我们规定区域 方便我们调节区域大小
void OnDramGizmos()
{ 
   Vector3 p1 = new Vector3(minPosX, maxPosY, transform.position.z);
   Vector3 p2 = new Vector3(maxPosX, maxPosY, transform.position.z);
   Vector3 p3 = new Vector3(maxPosX, minPosY, transform.position.z);
   Vector3 p4 = new Vector3(minPosX, minPosY, transform.position.z);
   
   Gizoms.color = Color.green;
   Gizoms.DrawLine(p1, p2);
   Gizoms.DrawLine(p2, p3);
   Gizoms.DrawLine(P3, p4);
   Gizoms.DrawLine(P4, P1);
}



今天的记录就到这里了,大家如果有需要也可以使用,如果大神们发现有错误或者有更好的写法,也可以在评论区告诉我,正好我也学习一下,感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值