相机拖动功能—带有缓动惯性效果
最近有需求是实现相机拖动功能,拖动之后还要相机带有惯性效果慢慢的停下。本人才疏学浅,实现不了,但是在网络上搜索到了一篇,具体在哪忘记了,特此记录一下, 供以后学习和复习。因为需求原因我稍加了改进,又不对的地方望大神们指出。
代码如下
要将相机调成正交模式使用
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);
}
今天的记录就到这里了,大家如果有需要也可以使用,如果大神们发现有错误或者有更好的写法,也可以在评论区告诉我,正好我也学习一下,感谢!