5-8 摄像机视距控制
在上一章中,创建了新的摄像机层级关系。在这一章中我们来实现第一个功能,就是摄像机的视距远近控制。我们可以用一个float变量记录当前的视距,当这个值为0的时候表示摄像机视距最远,反之为1的时候表示摄像机的视距最近。初始值为1即最近。代码如下:
1 | public class HexMapCamera : MonoBehaviour |
在PC平台下,摄像机改变视距通常都是通过鼠标滚轮或者类似的输入方法控制,所以我们可以使用Unity默认的MouseScrollWheel
在Update
方法里检查是否有输入增量,如果有再调用相应方法调整视距。代码如下:
1 | public class HexMapCamera : MonoBehaviour |
要控制视距缩放就简单的加上输入增量,然后将值限制在0-1之间即可。代码如下:
1 | private void AdjustZoom(float delta) |
因为摄像机Stick的子物体,我们在改变摄像机视距远近,其实就是在改变Stick的Z轴坐标。添加两个公共类型的float变量,用来规定Stick的最远和最近距离。由于我们创建的地图相对较小,先暂时设置为-250和-45。代码如下:
1 | public class HexMapCamera : MonoBehaviour |
设置好视距的最近最远值后,根据stickMinZoom
、stickMaxZoom
和zoom
三个数值进行插值计算,得出Stick的Z轴坐标值,也就是摄像机的视距。代码如下:
1 | private void AdjustZoom(float delta) |
现在能调整摄像机的视距了,但还是有些不太好用。通常游戏中的摄像机会在视距拉远的时候从斜向45度视角过渡到由上至下俯视角。这里我们可以通过旋转Swivel来实现,所以也同样为Swivel添加最大和最小的旋转角度标量,默认设置为90和45。代码如下:
1 | public class HexMapCamera : MonoBehaviour |
与计算Stick的Z轴坐标值类似,我们使用swivelMinZoom
、swivelMaxZoom
和zoom
三个值进行插值计算,得出Swivel的X轴旋转角度。代码如下:
1 | private void AdjustZoom(float delta) |
我们可以通过调整鼠标滚轮的灵敏度设置来控制视距的变化速度,在 Edit / ProjectSettings / Input Manager 面板中可以找到Mouse ScrollWhell
/ Sensitivity
,例如可以把灵敏度默认值0.1改为0.025来获得更为平滑的视距变化感觉。
如果不希望每次都要在Input Manager中修改鼠标滚轮的灵敏度,我们也可以创建一个控制鼠标灵敏度的变量,需要修改鼠标滚轮灵敏度的时候,我们只需要修改这个变量的值就可以了。代码如下:
1 | public class HexMapCamera : MonoBehaviour |
至此我们就完成了通过鼠标滚轮控制摄像机视距远近的功能,但是只能调整视距还无法满足灵活编辑地图的需求。在接下来的章节中,我们将为摄像机添加移动的功能。