相机系统是我们在游戏开发中非常重要的一个模块,而且随着现在的游戏越来越复杂,它的相机系统也越来越复杂,如何实现各种炫酷的镜头,如何管理场景中各个相机,就成为我们开发游戏中非常重要的一个问题。

Cinemachine作为Unity官方的解决方案,致力于帮助开发者高效的实现游戏中的相机系统。本文将由Unity技术经理成亮来为大家介绍如何利用Cinemachine快速创建游戏中的相机系统。

Cinemachine 相机系统总体介绍

首先我们来看一下在开发游戏的时候都会遇到的一些问题,大致分为五类:跟踪、瞄准、物理相关(碰撞、实现遮挡)、镜头特效、镜头切换。

这些问题适用于各类游戏,不管是2D还是3D游戏, 或者是各种视角的游戏。

014557qkt38o7sgdyv85gy.jpg

大家都知道,Unity都相机组件功能比较简单,主要是负责渲染相关的功能。为了解决上述问题,Cinemachine提供了一个虚拟相机的组件。这个组件不仅提供各种强大的功能,还提供一个非常灵活都架构以方便功能扩展。这个虚拟相机就好像拍电影的时候常见的摇臂或者导轨,它让相机的功能更加的强大。

014557xccgccnomnyvc1qm.jpg

Cinemachine提供了很多预先设置好的行为。例如:常见的第三人称绕着角色旋转的行为,或者沿着导轨滑动的行为。通过提前预置行为,可以帮助我们非常方便的来实现游戏中的功能。也就是通过程序化的方式,提升我们的开发效率。

Cinemachine核心组件包括Brain和Virtual Camera(虚拟相机),Brain负责相机的切换。虚拟相机复杂拍摄。

通常我们的场景中不是单一的虚拟摄像机,而是由很多台虚拟相机来完成拍摄任务,如下图所示。因此大家在制作游戏的时候更像是一个电影导演,可以通过各种相机实现各种炫酷的镜头,完成各种不同角度到拍摄。

014557uaz21j6qjql1p23j.jpg

虚拟相机详解
虚拟相机主要由六个模块组成,分别是:
Lens:包括调整FOV等参数; Body:负责处理相机和跟踪目标之间的相对位置的这样一个关系; Aim:负责处理焦点和跟踪目标在镜头中的相对位置; Noise:模拟手持相机的晃动; 后处理模块:让每个镜头有不同的后处理效果; Extnesions可扩展模块:包括碰撞处理等功能。


下面我们对重点模块进行详细讲解。



首先介绍Body模块,在代码层面称为Transposer,它的主要功能是处理场景中相机和它的目标之间的位置关系。我们可以把它用数学变量表示就是Offset,Offset是一个向量,不仅有大小还有方向。那么Offset的计算方式不同,可以带来不同的跟踪效果。

014557vwz2bojey1wmott3.jpg

Transposer的类型目前有五类:
Ransposer:基本类型; Obital Transposer:可以根据用户输入绕目标旋转; Framing Tansposer:在屏幕空间中计算相机和目标的Offset; Racked Dolly:把相机设置到一个轨道上; HardLockToTarget:把相机和目标的位置和朝向进行绑定,常用于第一人称模式。


014558s1v14j6jefoc6ojg.jpg

我们首先看一下Transposer类型。它的参数里面包括了相机和跟踪目标的偏移量,缓动参数,还有绑定的模式。

绑定模式目前是支持六种的绑定模式,大家看到前四种和LockToTarget相关,第五种是WorldSpace,第六种是SimpleFollowWithWorldUp。那么前四种其实它主要的意思是摄像机和目标之间的Offset的计算是以目标为参考系,也就是Offset是在目标的局部空间中,目标转动相机会跟着目标进行旋转,下面这些参数会有一些调整和变化,但是基本上大家理解之后就没有什么问题。WorldSpace则是把Offset放在世界坐标中计算,不会算目标旋转而选择。最后的SimpleFollowWithWorldUp则是把Offset放到相机的坐标系中进行计算。

014558qy5pwzp0n2bppzdp.jpg

Obital Transposer能接受用户的输入,并根据这个输入控制相机绕着目标进行旋转,主要是运用在第三人称游戏。由于旋转的时候需要一个基准的方向,而这个方向我们称之为Heading。

014558yuotoeowydpioto2.jpg

Framing Transposer计算屏幕空间中相机和目标的相对位置,常用于2D游戏。

014559chu05us0swshph4p.jpg

接下来我们再看虚拟相机的另一个重要组件Aim,在代码层面我们也称之为Composer。其中包含基本类型Composer;Group Composer不是跟踪单一目标,是跟踪群体中的某个位置;然后是POV,类似于第一人称相机的模式,没有具体跟踪到某一个目标,但是根据输入进行自由旋转。然后Hard Look At是锁死某一个目标,然后还有Same As Follow主要是对Follow的目标,保持同样的旋转和朝向。

014559vzzixssd42bamtyj.jpg

在Composer中可以设置焦点和目标之间的偏移,追踪目标时候的缓动。在下图中的红色区域我们称之为是DeadZone,当相机和目标距离相对位置超出边界的时候,相机才进行追踪,这也是为了实现一些缓动的效果。那么除此之外还可以设置整个焦点的偏移,我可以把整个相机的焦点区域往任何一个屏幕方向进行偏移。

014559aqau2ztih2tqkwuc.jpg

POV Composer通常和Hard lock To Targt来结合实现第一人称视角相机。

014600cat8zpni1p3zngkj.jpg

Noise组件用于实现相机和目标之间的晃动效果。

015040x7tjrntlh7wrh8wt.png

Postprocessing组件,每个相机都可以添加一组后处理效果。

015125fcytjlqqeqkbqa3t.jpg

扩展组件,有Collider负责相机碰撞检测以及视线遮挡等功能;Confiner负责定义相机的活动范围;FollowZoom动态调整镜头FOV,以便目标在移动的时候会在镜头中保持同样的大小;Story Board是最新的功能,可以在镜头中放置一副参考图,便于摆放位置和调色。

015125tz66nquf7fbwqknn.jpg

相信通过以上介绍,我们已经了解了虚拟相机的基本功能。下面就结合这些基本功能,为大家展示按照下面步骤如何实现追踪赛车的相机。
通过Cinemachine菜单在场景中创建一台虚拟相机(Virtual Camera)。 然后设置Look At 和 Follow为赛车(Ship)。 在Body组件中对相机的位置进行微调,就是Follow Offset部分的参数。 由于我们的相机是随着赛车转动而转动,所以绑定模式应该是Lock To Targt这个模式。 为了增加真实感,还需调整Damping部分参数以实现缓动效果。 为了避免侧翻或者转弯的时候显得非常生硬,可以调整转动相关的缓动参数。具体的参数数值可以参考下图。


015125gkdgdnudnfddppsd.jpg

通过以上这些简单的设置,我们就实现了一个效果不错的赛车跟随相机。

组合虚拟相机介绍
Unity为大家提供了种类比较丰富的组合相机,包括:FreeLook,BlendList,State Driven,Dolly Camera,2D Camera等。

015125o4b4dq9bqhmudsit.jpg

FreeLook可以围绕目标水平和竖直转动,实际上由三个Body组件为Obit Transposer的虚拟相机构成。我们可以利用FreeLook很轻易的实现第三人称相机。

015125h2s5rolp2o39n539.jpg

State Driven相机可以把动画状态和相机进行绑定,当动画状态切换的时候,相机自动进行切换。

015126utytpytccoet6ces.jpg

Clear Shot相机可以管理一组相机,自动选择进行最佳拍摄的距离。

015126mk199arri5kkey24.jpg

Target Group相机可以设置相机焦点到多个拍摄目标的中间。比如两个人谈话的时候相机不是对着某个人,而是直接对他们的中间,并且我们可以设置权重调整焦点的偏移。

015126oadfm4adxumd16kf.jpg

Cinemachine和Timeline
Cinemachine提供了Timeline轨道,因此我们可以用Timeline管理场景中的虚拟相机,让虚拟相机更精确的在时间轴上面进行动画的播放以及镜头的混合。

015126ri8nz4elv68i0i40.jpg

小结
通过本文介绍,我们可以看到Cinemachine为游戏的制作提供了一套较为完整的解决方案。通过这些功能,我们可以快速的实现各种相机效果。并且虚拟相机也提供了非常开放和灵活的架构,大家可以根据需求对相机行为进行扩展。更多Unity技术文章,欢迎访问Unity官方中文论坛(Unitychina.cn)!
Cinemachine

幻灯片07.jpg(83.96 KB, 下载次数: 1)

 

幻灯片07.jpg锐亚教育

锐亚教育 锐亚科技 unity unity教程