Unity版本:2019.3.6f1

长文警告!!!

是否为摄像机脚本困扰?是否为镜头动画烦恼? Cinemachine 超强插件解决你的问题!

安装Cinemachine

现在Cinemachine作者已经投靠unity官方了,所以Cinemachine也成为了Unity的官方插件,我们可以直接在PackageManager中下载:

各类相机简述

安装之后我们可以在顶部菜单栏,看到如下的选项:

选项 说明
Virtual Camera 虚拟摄像机
FreeLook Camera 自由相机,可以保证镜头内出现头和身体,及相机的活动范围在目标周围圆柱(曲面的)表面,一般用于第三人称控制器
State-driven Camera 状态驱动相机。添加虚拟相机列表,可以在不同的相机直接直接实现平滑切换,同时其子相机列表如果没有设置LookAt对象等,会直接使用这个父相机的对象。
ClearShot Camera 干净镜头相机。类似上一个相机,区别在于这个相机可以通过判断子相机的CinemachineCollider(如果有),看是否相机被场景物体阻碍,切换相机。具体可看其源码注释。
Dolly Camera with Track 可推拉的轨道相机。通过结合轨道路径,就可以模拟像拍电影般镜头轨道移动。
Group Target Camera 多目标相机。可以同时设置多个目标。

Cinemachine Brain

在我们创建任意虚拟相机后,插件会为我们的摄像机添加此组件,此组件是我们虚拟相机的大脑,控制着真实相机的行为。(不可或缺)

变量名 说明
Live Camera 当前选择的虚拟相机。
Live Blend 当前的镜头转换名称。
Show Debug Text 在游戏画面左上角显示调试信息。
Show Camera Frustum 显示相机的视锥体,相比原来自带的边框,这个会裁切掉不在显示范围内的边线。
World Up Override 重载世界的向上方向(y轴),虚拟相机是通过这个来判断世界环境。
Default Blend 默认相机切换模式。
Custom Blends 自定义相机切换模式。
Camera Cut Event 相机立即切换时事件。
Camera Activated Event 相机混合(就是有切换变化,不是Cut时)切换时第一帧事件。

Virtual Camera

Cinemacine Virtual Camera 是Cinemachine最基本的相机,

变量名 说明
Status 状态,Live为正在使用,Standby为准备使用(没在用,但如果上一级停用了,可能会切换到当前虚拟相机),Disable为不能用。按Solo按钮会让相机切换到这个虚拟相机(包括Disable)。
Game Window Guides 是否在game窗口显示辅助
Save During Play 保存游戏中的改变
priority 虚拟相机的优先级,如果同时有多个虚拟相机,使用优先级最高的。如果多个同等级的,应该是按Hierarchy顺序找到第一个虚拟相机。
Lens 镜头常用配置。视角区域,最近最远裁切平面, 镜头旋转角度。
Body 相机本身。四种:Hard constraint,固定距离,相当于第一人称。 Orbital Transposer:轨迹转换器?似乎是模拟第三人称。 Tracked Dolly,轨道推拉,相机只能在轨道上移动(即使设置了Follow对象),需要轨道路径CinemachinePath。 Transposer,普通的镜头转换。
Aim 瞄准设置,有三种:Hard constraint,固定距离,没有任何平滑效果。Composer,有平滑效果的瞄准目标。Group Composer,同时瞄准多个目标。
Noise 噪音,用于相机抖动,预设有多种效果,也可以自己建立新效果。
Extension 扩展,可以添加诸如相机碰撞器,相机变焦器等

TimeLine

在TimeLine中实现2个镜头间的切换非常容易。

FreeLook


FreeLook相机是一个自由相机,类似于第三人称游戏中的相机,可以使用鼠标控制相机的朝向多方向的观察角色;其相机视野像是一个圆柱体,如上图所示。(相机始终会在这个圆柱体的轨道上运动。)

大多数参数与Virtual Camera相似,值得注意的是:
在FreeLook相机中需要绑定 顶部,中间,底部三个位置,这三个位置将决定相机的最大视野。

BlendList

如名字一样他管理的是一个camera列表,并将列表内的camera做混合到达射线机之间更自然的切换效果。
我们可以控制摄像机切换的 缓动函数
值得注意的是:当BlendList启用时,其下的摄像机会依次使用最后停留在最后一个摄像机里。

CinemachineStateDrivenCamera

这是被动画状态所驱动的虚拟相机管理器,能够在觉得切换动画时,快速的切换该动画应该使用的相机。【注意设置层级和绑定动画控制器】

ClearShoot

ClearShoot 也是一个管理器,负责管理一组camera,他的效果是时刻选择最优的摄像机。在复杂的场景中,我们的角色可能被环境所遮挡,我们需要多个摄像机来处理这种情况。
如下图所示,我设置了2个摄像机,一个在顶部,一个在后方,在角色移动到墙壁后面时,后方的摄像机被遮挡,此时会自动启动顶部摄像机。在角色回到墙壁后面时,顶部摄像机被遮挡,只能切换到后面的摄像机。

TargetGroup


目标组管理器,可以让位于目标组管理器中的目标尽可能的位于屏幕中。
在使用目标组管理器时,务必为摄像机设置目标组类型:

Mixing

Mixing摄像机混合管理器,可以将多个摄像机的信息进行混合按照权重,得到最终的显示画面。
(通过多相机的焦点处建立坐标系按权重分配偏移)

活区和死区

  • A区域为死区(Dead Zone),对象在死区内任意移动不会改变摄像机的位置。
  • B区域为活区(Soft Zone),对象在活区时会触发摄像机缓动,最终将对象固定在死区。
  • C区域为界外区,对象在界外区活动时,摄像机会立即改变位置时,使对象位于活区。

本文参考

[1]Unity Cinemachine插件学习笔记
[2]个人笔记】Unity插件“Cinemachine”——实现尼尔机械纪元运镜设计

Dolly轨道

我们可以创建一个自定义的轨道,将摄像机限制在该轨道上。

如图所示我创建了一个圆形轨道,摄像机只能在轨道上运动。

Dolly with Cart轨道

让物体沿着轨道运动
(这是一个很强大的功能,其实我们不止能用在摄像机上,可以用在任何游戏对象上,让这个对象,或ui只能沿着这个轨道运动,并实时设置要达到哪个点,简言之这是一个曲线编辑器。)

总结

Cinemachine是一款非常棒的智能摄像机插件,非常的方便易用。解决大部分的摄像机问题,甚至无需编写代码。当然我们也可以使用代码来控制摄像机,更灵活的处理摄像机与角色之间的关系。