在游戏制作中,如果游戏场景超出一个屏幕,就需要通过镜头移动来使角色重新回到屏幕当中。 在本次教程中,我们将学习如何平滑移动镜头、以及如何控制镜头的移动边界。
点我下载教学工程
点我下载教学素材
你可以观看视频学习,也可以下拉查看文字教程
镜头控制的教程视频
要使镜头可以自由移动,需要解除游戏的边界限制。
选择目标场景,在属性中勾选不限边界
一般来说,我们可以让镜头跟随玩家, 但是不同的游戏可能会出现让镜头跟随敌人这样与玩家位置无关的镜头移动。
所以我们创建一个隐藏的镜头对象,让镜头跟随该对象,这样如果希望镜头跟随玩家,只需要让镜头对象跟随玩家,如果希望镜头跟随敌人,就让镜头对象跟随敌人就好。
玩家不需要真正看见该对象,在场景开始时,将镜头对象的不透明度设为0.
为了看出移动的效果,我们添加一张背景图片。
如果要对某个物体进行镜头跟随,可以在该对象身上添加镜头跟随能力,本篇教程不使用这种方式,而是通过事件表来控制镜头移动。
使用系统组件提供的聚焦到某处
将镜头聚焦到镜头对象的位置上
为了看到效果,我们创建一个可移动的玩家角色,并让镜头对象始终跟随
添加八方向运动能力(加速度设置的很大可以让玩家立刻到达最大速度,去掉了加速的过程)
使镜头对象的坐标始终与玩家保持一致
在完成以上操作后,预览游戏,镜头即可跟随玩家的移动而移动。
虽然上述操作可以实现镜头的跟随,但是由于我们直接将聚焦的坐标设置到镜头对象上,所以会使镜头跟随效果显得很生硬。下面我们针对聚焦事件进行改良,使镜头平滑的移动到镜头对象上,而不是立刻移动过去。
要实现平滑移动效果,我们需要用到lerp(a,b,c)表达式。
将聚焦位置从 镜头对象.x 改成 lerp(scrollx,镜头对象.x,dt*5) 。 Y坐标同理
scrollx和scrolly表达式用于获取当前聚焦位置的坐标。 dt*x可以理解为镜头平滑移动的速度。 x的值越大,镜头移动的越快。
改良事件后,预览游戏可以看到,镜头虽然跟随玩家,但是速度上会慢一拍,需要等待一小段时间才会到达玩家位置。
虽然我们实现了镜头的平滑移动,但是上述事件会让玩家始终处于镜头的中心位置。 在一些有场景边界的游戏中,例如马里奥,玩家在最左侧或最右侧时,镜头是不会跟随玩家的。因为,下面我们要给镜头移动增加限制
为了更方便的设置镜头移动边界,我们创建4个镜头边界对象,并分别设置锚点到边缘位置
将4个镜头边界对象拖入场景
需要注意的是,镜头的最小边界为窗口大小,也就是上图中的虚线部分。上下左右4个边界对象不能放错方向。例如,镜头边界_上必须放置在镜头边界_下的上方
我们使用clamp(x,min,man)表达式来限制镜头移动的范围。
具体写法:
X:clamp(lerp(scrollx,镜头对象.X,dt * 5),镜头边界_左.x+(originalviewportwidth/2),镜头边界_右.x-(originalviewportwidth/2))
Y: clamp(lerp(scrolly,镜头对象.Y,dt * 5),镜头边界_上.y+(originalviewportheight/2),镜头边界_下.y-(originalviewportheight/2))
在完成上面的操作后,预览游戏可以看到,镜头只会在镜头边界内进行跟随
想要更改镜头边界的范围,只需拖动4个边界对象即可(每个镜头边界只管理一个方向,镜头边界_上的X方向不影响效果,只需关注Y坐标即可)
以上便是镜头控制的教程,重点是lerp和clamp表达式的运用。您可以自行更改参数,调整镜头跟随速度或更改镜头跟随的角色