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在默认情况下就直接被配置为了这个模式。
有很多游戏的相机运动模式都是这样,唯一的区别是加速度会有所不同,在这只需要调整XDamping和YDamping两个值就可以达到效果。这个值越小在对应方向上跟随的速度就会越快
当然如果想要完全紧随的效果,就像节奏地牢一样,镜头完全跟随玩家的角色,几乎没有平滑效果,也可以通过调整这两个值实现。
打开俯视角的场景后,按照同样的方式添加Cinemachine的虚拟摄像机,调整视口大小。
为了做到完全跟随的效果,只要把XDamping、YDamping调为0即可,这样相机就相当于不再有平滑跟随的效果了。
回过头来再看一眼梅塔特隆这个游戏,这个游戏的相机并不像另外的游戏一样 只要角色停下就保持在正中的位置。而是当角色移动到某个位置后,就像顶到了一条边线一样,这个时候相机才开始有跟随的行为。
那么为此,我们除了要调节跟踪的速度外,还需要设置当角色超过了哪条线才开始跟踪。这时候就要用上设定里Dead Zone这一项。
这里的Dead Zone指的就是由四条边界组成的盒子,只要角色不超出这个范围,无论怎么移动,相机也不会变动。
可以看到调整后,角色周围蓝色的部分内部又多出了一块完全透明的区域,这个就是Dead Zone的实际大小。
再加上X方向和Y方向上的平滑后运行一下
可以看到只要我们的角色还在区域里,相机就不会再动,只有出了区域之后才会进入跟踪的状态。
有一些游戏,会为镜头跟踪添加一些额外的限制,例如银河战士这款游戏。
大部分情况下,它的跟踪行为都和之前讲述的那些游戏差不太多,人物移动时摄像机跟随,并且保持人物在画面中间的一定范围。在相机到地图遇边界时,就不跟了。
首先回到侧视角的场景,可以看到按照现在的设置,相机会直接跟随角色运动,不会受到地形边界的影响。
那么在这为了实现到达边界不跟随的效果,我给虚拟摄像机添加了Cinemachine Confiner的扩展功能。
为了标记地图的边界,需要额外添加一个2d碰撞区,在这我创建了一个多边形碰撞盒将地图包裹住,并勾选is trigger选项。
完成后把新建好的碰撞区拉到Cinemachine Confiner对应的位置,再运行游戏,就可以看到现在摄像机已经可以被地图的边界所限制了。
有的时候不光是玩家的位置会限制相机,同样相机也会限制玩家的移动。例如在很早版本的马里奥游戏里,玩家向右移动后,相机会跟随玩家移动,此时人物永远在左半边画面内。一旦角色尝试往回走,走到相机的左边界时,就会像撞到一堵墙一样不能再走。这种跟随方式,在一些现代游戏的追逐战中也很常见。
由于需要让角色向右移动时相机跟随,向左移动时相机静止,所以在这需要在控制死区大小的同时,也控制它和相机位置的偏移。这时候就需要用上Screen X和Screen Y两个参数,用来控制整个屏幕相对于参考点的偏移量。
调整完后运行,可以看到已经实现了需要的跟随效果,但人物会跑出屏幕边界。
所以我又额外创建了一个用来阻挡角色移动的碰撞区,并让它成为相机的子物体跟随相机移动。
这样运行起来就可以完整模拟需要的效果了。
以上这些都只是一些简单的跟踪方式,结合Unity例如状态机等其他功能,还可以让参数在特定的情况下发生改变,用来实现更复杂的相机控制逻辑。
例如可以使用代码直接控制参数,也可以用动画状态机实现在各种配置好的状态间进行转换。只要多尝试各种组合,一定能找到合适自己的方案。
好了我这期分享就到这里了,感兴趣的同学别忘了去B站MCATIN账号下给我来个三连,让我们之后再见吧!
谢谢分享~~
关于Cinemachine Confiner有个小细节,它貌似只接受多边形碰撞器,即便其实想用矩形区域也得用多边形碰撞器去画一个;如果是在游戏运行过程中通过代码改变Cinemachine Confiner关联的碰撞器,注意要调用一次InvalidatePathCache方法来刷新碰撞器的顶点路径才能让新的设置生效。
O(∩_∩)O