Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换
Cinemachine在2017版中正式加入,结合Timeline可以轻松的制作出一下相机动画。相比Unity自带的标准相机,这个Cinemachine插件可操作的变量更多,不同虚拟相机(用来控制相机的)可以平滑转换等,具体可以参考上篇《Unity Cinemachine插件学习笔记,结合Timeline实现简单场景动画》。
选项名 | 说明 |
---|---|
Virtual Camera | 普通虚拟相机。最常用的相机设备。其实下面的都是虚拟相机。 |
FreeLook Camera | 自由查看相机。可以保证镜头内出现头和身体,及相机的活动范围在目标周围圆柱(曲面的)表面,常用于第三人称视角。 |
State-driven Camera | 状态驱动相机。添加虚拟相机列表,可以在不同的相机直接直接实现平滑切换,同时其子相机列表如果没有设置LookAt对象等,会直接使用这个父相机的对象。 |
ClearShot Camera | 干净镜头相机。类似上一个相机,区别在于这个相机可以通过判断子相机的CinemachineCollider(如果有),看是否相机被场景物体阻碍,切换相机。具体可看其源码注释。 |
Dolly Camera with Track | 可推拉的轨道相机。通过结合轨道路径,就可以模拟像拍电影般镜头轨道移动。 |
Group Target Camera | 多目标相机。可以同时设置多个目标。 |
相机的脑子,只有这个组件要添加到Camera上,才能实现任何虚拟相机的效果。
变量名 | 说明 |
---|---|
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时)切换时第一帧事件。 |
变量名 | 说明 |
---|---|
Status : Live/Standby/Disable | 当前这个虚拟相机的状态。Live为正在使用,Standby为准备使用(没在用,但如果上一级停用了,可能会切换到当前虚拟相机),Disable为不能用。按Solo按钮会让相机切换到这个虚拟相机(包括Disable)。 |
Priority | 虚拟相机的优先级,如果同时有多个虚拟相机,使用优先级最高的。如果多个同等级的,应该是按Hierarchy顺序找到第一个虚拟相机。 |
Look At | 相机的视角目标。 |
Follow | 相机的跟随目标。 |
Lens | 镜头常用配置。视角区域,最近最远裁切平面, 镜头旋转角度。 |
Aim | 瞄准设置,有三种:Hard constraint,固定距离,没有任何平滑效果。Composer,有平滑效果的瞄准目标。Group Composer,同时瞄准多个目标。 |
Body | 相机本身。四种:Hard constraint,固定距离,相当于第一人称。 Orbital Transposer:轨迹转换器?似乎是模拟第三人称。 Tracked Dolly,轨道推拉,相机只能在轨道上移动(即使设置了Follow对象),需要轨道路径CinemachinePath。 Transposer,普通的镜头转换。 |
Noise | 噪声。可以模拟相机手持抖动效果。 |
如上图配置,虚拟相机会找到带脑子的相机并控制他的位置角度,游戏画面中,黄点是目前目标坦克的位置(设置了z轴偏移量5,所以实际位置在坦克向前5个单位)。最里面黄色区域(Dead Zone)为黄点自由移动区域,在这个范围内 目标移动了并不会改变相机位置。第二层绿色区域(Soft Zone)为目标允许在的范围,不过随时间推移最后会限制在最里层。最外层红色区域为目标不允许停留范围,及坦克一旦脱离绿色以外的区域,会立即移动相机来保持目标不离开镜头范围。
单个目标
实际运行时,是使用Hard constraint。因为主角旋转幅度大,镜头变化大,使用Transposer的自由范围会产生不适。
多个目标
变量名 | 说明 |
---|---|
Position Mode | 位置模式。Group Center,所有目标的中心(长方体中心)。 Group Average,所有目标位置和权重的平均值。 |
Rotation Mode | 旋转模式。Manual,手动,就是根据虚拟相机身体设置。Group Average,所有目标旋转平均值。 |
因为目标不是简单的Transform,而是包含权重和半径的。所以在使用代码添加时,需要创建其结构体:CinemachineTargetGroup.Target。是在类内嵌的结构体,具体可见其源码。下面用代码实现添加对象组。
public void SetTargets(params Transform[] targets) { if (targets.Length <= 0) return; CinemachineTargetGroup.Target[] cmTargets = new CinemachineTargetGroup.Target[targets.Length]; for (int i = 0; i < targets.Length; i++) cmTargets[i] = new CinemachineTargetGroup.Target() { target = targets[i], weight = 1f, radius = 1f }; targetGroup.m_Targets = cmTargets; //将创建的列表赋给目标对象组。 }
(上面粒子有Bug,是更新2017版本后出现的,不要在意。)
单个目标 和 多个目标之间切换
上图自定义混合变化包含两个虚拟相机的切换,在资源文件中创建(Create/Cinemachine/Blender/Settings),分别是单目标和多目标(其实这里加不加都一样,因为样式和默认的一样)。代码很简单,只要设置虚拟相机是否开启即可。
// 多目标转换到单目标 cmFollowCameraRig.followVitualCamera.enabled = true; // 激活单个目标虚拟相机组件 cmMultiTargetCameraRig.multiVirtualCamera.enabled = false; // 关闭多目标虚拟相机组件 // 单目标转换到多目标,与上面相反 cmFollowCameraRig.followVitualCamera.enabled = false; cmMultiTargetCameraRig.multiVirtualCamera.enabled = true;