【unity 技术教程】如何实现常规 2D 游戏镜头?

作者:MCATIN
2020-12-19
9 7 1

Hi,大家好,我是浙传的吕佳茜!

最近发现了一个超好用的镜头插件——Cinemachine。Cinemachine 是 Unity 官方推出的一个免费的资源,虽然上手前需要做少量的学习,但是可以只靠配置的方式控制摄像机的行为。对于不想写代码的人来说,可以说十分友好了。

这次呢我将分享一些有关的基础知识,然后实现一些常见的 2d 游戏镜头。

我从 unity 商店里模板分类里找到了一个免费的 2d 游戏模板 Simple 2D Template 用来当做演示场景。

导入之后先运行一下,检查一下需要用到的侧视角和俯视角两个场景,并禁用了自带的摄像机跟随脚本。其中俯视角场景默认使用了透视模式的相机,在这我也给改成了正交模式。

接下来就是安装 Cinemachine 插件。 这里需要点击 window 菜单,然后点击 PackageManager,找到 Cinemachine 后安装它。安装完成后,在菜单栏里就可以找到 Cinemachine

准备工作结束后我们先大概了解一下 Cinemachine 的基础使用方法

先点击菜单栏的 Cinemachine,选择 Create 2D Camera

创建后,除了新出现的虚拟摄像机外,原来的主摄像机旁边会有一个 Cinemachine 的图标,画面也会产生变化。

点击 CM vcam1,可以看见右边的 inspector 窗口里有很多参数。把 CharacterPlatformer 拉到 Follow 的属性,这里指的就是摄像机跟随的物体。调节合适的视口大小后,点击运行,可以看见有一个黄点。这个黄点标记出来的就是镜头跟随的实际参考点。可以看到在默认的情况下,镜头就有了平滑跟随的效果。

说到平滑跟随,有很多像是《战斗方块剧场》这类的游戏都属于这种模式,这也算最常见的一种跟踪模式,本质就是相对直接跟随坐标添加了平滑的效果。所以 Cinemachine 在默认情况下就直接被配置为了这个模式。

有很多游戏的相机运动模式都是这样,唯一的区别是加速度会有所不同,在这只需要调整 XDampingYDamping 两个值就可以达到效果。这个值越小在对应方向上跟随的速度就会越快

当然如果想要完全紧随的效果,就像节奏地牢一样,镜头完全跟随玩家的角色,几乎没有平滑效果,也可以通过调整这两个值实现。

打开俯视角的场景后,按照同样的方式添加 Cinemachine 的虚拟摄像机,调整视口大小。

为了做到完全跟随的效果,只要把 XDampingYDamping 调为 0 即可,这样相机就相当于不再有平滑跟随的效果了。

回过头来再看一眼梅塔特隆这个游戏,这个游戏的相机并不像另外的游戏一样 只要角色停下就保持在正中的位置。而是当角色移动到某个位置后,就像顶到了一条边线一样,这个时候相机才开始有跟随的行为。

那么为此,我们除了要调节跟踪的速度外,还需要设置当角色超过了哪条线才开始跟踪。这时候就要用上设定里 Dead Zone 这一项。

这里的 Dead Zone 指的就是由四条边界组成的盒子,只要角色不超出这个范围,无论怎么移动,相机也不会变动。

可以看到调整后,角色周围蓝色的部分内部又多出了一块完全透明的区域,这个就是 Dead Zone 的实际大小。

再加上 X 方向和 Y 方向上的平滑后运行一下

可以看到只要我们的角色还在区域里,相机就不会再动,只有出了区域之后才会进入跟踪的状态。

有一些游戏,会为镜头跟踪添加一些额外的限制,例如银河战士这款游戏。

大部分情况下,它的跟踪行为都和之前讲述的那些游戏差不太多,人物移动时摄像机跟随,并且保持人物在画面中间的一定范围。在相机到地图遇边界时,就不跟了。

首先回到侧视角的场景,可以看到按照现在的设置,相机会直接跟随角色运动,不会受到地形边界的影响。

那么在这为了实现到达边界不跟随的效果,我给虚拟摄像机添加了 Cinemachine Confiner 的扩展功能。

为了标记地图的边界,需要额外添加一个 2d 碰撞区,在这我创建了一个多边形碰撞盒将地图包裹住,并勾选 is trigger 选项。

完成后把新建好的碰撞区拉到 Cinemachine Confiner 对应的位置,再运行游戏,就可以看到现在摄像机已经可以被地图的边界所限制了。      

有的时候不光是玩家的位置会限制相机,同样相机也会限制玩家的移动。例如在很早版本的马里奥游戏里,玩家向右移动后,相机会跟随玩家移动,此时人物永远在左半边画面内。一旦角色尝试往回走,走到相机的左边界时,就会像撞到一堵墙一样不能再走。这种跟随方式,在一些现代游戏的追逐战中也很常见。

由于需要让角色向右移动时相机跟随,向左移动时相机静止,所以在这需要在控制死区大小的同时,也控制它和相机位置的偏移。这时候就需要用上 Screen XScreen Y 两个参数,用来控制整个屏幕相对于参考点的偏移量。

调整完后运行,可以看到已经实现了需要的跟随效果,但人物会跑出屏幕边界。

所以我又额外创建了一个用来阻挡角色移动的碰撞区,并让它成为相机的子物体跟随相机移动。

这样运行起来就可以完整模拟需要的效果了。

以上这些都只是一些简单的跟踪方式,结合 Unity 例如状态机等其他功能,还可以让参数在特定的情况下发生改变,用来实现更复杂的相机控制逻辑。

例如可以使用代码直接控制参数,也可以用动画状态机实现在各种配置好的状态间进行转换。只要多尝试各种组合,一定能找到合适自己的方案。

好了我这期分享就到这里了,感兴趣的同学别忘了去 B 站 MCATIN 账号下给我来个三连,让我们之后再见吧!