我们都知道在scene场景内利用鼠标可以随意查看场景,拉近拉远,移动,那么在游戏运行时是无法做到的,这就需要我们利用代码来控制相机。
首先我们需要以下字段等,保存相机组件是为了可以使代码灵活。,不必挂载相机上。有两种模式,一种计算基于屏幕中心,即你的操作中心点在屏幕中心,还有一种是基于上一帧点击位置。
public Camera cam;//相机组件
//计算中心点选取
public enum MouseCenter
{
ScreeenCenter,//屏幕中心
LastPosition,//点击点
}
public MouseCenter mouseCenter= MouseCenter.LastPosition ;//
public float RotateSpeed = 1;//旋转速度
public float MoveSpeed = 10;//移动速度
public float ZoomSpeed=1;//缩放速度
private Vector3 MoveDir;//方向
private Vector3 RotateDir;//
public int Sensitivity = 1;//灵敏度
private Vector2 mouseDownPos;//记录按下时鼠标位置
在这里我对灵敏度进行强行限制,阻止负值。.
void Start()
{
if (Sensitivity < 0)
Sensitivity = 0;
}
下边为计算,在update中调用:
//计算
private void Calculate()
{
Vector2 newpos = Vector2.zero;
switch (mouseCenter)
{
case MouseCenter.ScreeenCenter:
newpos = new Vector2(Input.mousePosition.x - Screen.width / 2, Input.mousePosition.y - Screen.height / 2);//获取鼠标点相对屏幕中心向量差
break;
case MouseCenter.LastPosition:
newpos = new Vector2(Input.mousePosition.x - mouseDownPos.x, Input.mousePosition.y - mouseDownPos.y);//获取基于按下瞬间的向量差值
mouseDownPos = Input.mousePosition;
break;
default:
return;
}
Space spacetype = Space.Self;
if (Mathf.Abs(newpos.x) > Sensitivity || Mathf.Abs(newpos.y) > Sensitivity)//拖动距离太短,不计算
{
//计算
if (Mathf.Abs(newpos.x) > Mathf.Abs(newpos.y))
{
if (newpos.x < 0)
{
MoveDir = cam.transform.right;
RotateDir = Vector3.down;
}
else
{
MoveDir = -cam.transform.right;
RotateDir = Vector3.up;
}
}
else
{
if (newpos.y < 0)
{
MoveDir = Vector3.left;
RotateDir = Vector3.right;
}
else
{
MoveDir = Vector3.right;
RotateDir = Vector3.left;
}
}
if (Input.GetMouseButton(1))
{
if (Mathf.Abs(newpos.x) > 10 && Mathf.Abs(newpos.y) > 10)
spacetype = Space.World;
cam.transform.Rotate(RotateDir*RotateSpeed * Time.deltaTime * 50, spacetype);
}
if (Input.GetMouseButton(2))
{
//transform.Translate(MoveDir * MoveSpeed * Time.deltaTime * 10);
cam.transform.position += MoveDir * MoveSpeed * Time.deltaTime * 10;
return;
}
}
else
{
float h = Input.GetAxis("Mouse ScrollWheel");
if (h == 0)
return;
int dir = h > 0 ? 1 : -1;
cam.transform.position += transform.forward * dir * ZoomSpeed * Time.deltaTime * 20;
}
}
运行即可实现相机的移动缩放,旋转。
想要源代码的可以去这里下载,只要1积分