查看原文
其他

利用Cinemachine快速创建游戏中的相机系统

Unity Unity官方平台 2018-11-15

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


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

 

 Cinemachine 相机系统总体介绍

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


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


 

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



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

 

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


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


虚拟相机详解

虚拟相机主要由六个模块组成,分别是:

  • Lens:包括调整FOV等参数;

  • Body:负责处理相机和跟踪目标之间的相对位置的这样一个关系;

  • Aim:负责处理焦点和跟踪目标在镜头中的相对位置;

  • Noise:模拟手持相机的晃动;

  • 后处理模块:让每个镜头有不同的后处理效果;

  • Extnesions可扩展模块:包括碰撞处理等功能。


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

 


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


 

Transposer的类型目前有五类:

  • Ransposer:基本类型;

  • Obital Transposer:可以根据用户输入绕目标旋转;

  • Framing Tansposer:在屏幕空间中计算相机和目标的Offset; 

  • Racked Dolly:把相机设置到一个轨道上;

  • HardLockToTarget:把相机和目标的位置和朝向进行绑定,常用于第一人称模式。

     


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


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

 

 

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

 


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



 

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




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



 

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



 

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


 

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


 

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



 

相信通过以上介绍,我们已经了解了虚拟相机的基本功能。下面就结合这些基本功能,为大家展示按照下面步骤如何实现追踪赛车的相机。

  • 通过Cinemachine菜单在场景中创建一台虚拟相机(Virtual Camera)。

  • 然后设置Look At 和 Follow为赛车(Ship)。

  • 在Body组件中对相机的位置进行微调,就是Follow Offset部分的参数。

  • 由于我们的相机是随着赛车转动而转动,所以绑定模式应该是Lock To Targt这个模式。

  • 为了增加真实感,还需调整Damping部分参数以实现缓动效果。

  • 为了避免侧翻或者转弯的时候显得非常生硬,可以调整转动相关的缓动参数。具体的参数数值可以参考下图。



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

组合虚拟相机介绍

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


 

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


 

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


 

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



 

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


Cinemachine和Timeline

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


小结

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


推荐阅读


点击“阅读原文”访问Unity官方中文论坛

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存