# 前言
主要内容来源于官方 Cinemachine2.8 英文文档:https://docs.unity3d.com/Packages/com.unity.cinemachine@2.8/manual/CinemachineUsing.html
花了一个星期,学习之余,借助翻译软件一边看一边验证(顺便翻译,注:并不完全按照文档来的)
# Virtual Camera
# 基本情况
首先,场景中一般只有一个 Unity 相机(或者单独分离的 UI 相机),但可以有多个虚拟相机(不过一般只有一个活动)
虚拟相机应该算是 Cinemachine
中主要的一个组件,在某个虚拟相机处于活动状态时, Cinemachine
会将其移动和旋转等控制同步到 Unity 相机上。
- 一般只有一个活动虚拟相机会控制 Unity 相机,除非设置了从一个虚拟摄像机到下一个虚拟摄像机进行混合操作,处于混合状态下的情况。
虚拟相机的主要功能有:
- 控制场景中的 Unity 相机位置
- 将 Unity 相机对准目标
- 向 Unity 相机添加程序噪声,模拟诸如手持效果或车辆震动之类的东西
虚拟相机本身消耗很少,不过如果场景对性能敏感也可以直接禁用不需要的虚拟相机。
建议对于每个镜头都使用独立的虚拟相机进行拍摄,然后再进行剪切或混合,例如:
- 对于两个角色交换对话的过场动画,使用三个虚拟相机:一个相机用于两个角色的中间镜头,另一个虚拟相机用于每个角色的特写镜头,使用 Timeline 将音频与虚拟摄像机同步
- 复制一个现有的虚拟摄像机,使两个虚拟摄像机在场景中处于相同的位置,对于第二个虚拟相机,更改 FOV 或拍摄视图。当玩家进入触发空间时,Cinemachine 会从第一个虚拟摄像机混合到第二个虚拟摄像机以强调动作的变化
另外 Cinemachine 支持正交摄影机,将 Unity 摄像机的投影设置为正交投影时,Cinemachine 会自动进行调整适应,在镜头的虚拟相机属性中,FOV 被 OrthographicSize 取代
- 在正交环境中,旋转相机通常没有意义。因此 Cinemachine 提供了 FramingTransposer 来处理取景和构图,而无需旋转摄像机
# 创建方式
在 Unity 菜单中选择 GameObject > Cinemachine > Virtual Camera
- 在场景创建 Virtual Camera 时,若主相机没有 CinemachineBrain,会自动挂一个 CinemachineBrain 上去,主相机及与虚拟相机位置会自动同步并保持一致
# 通用属性
# 移动或瞄准
虚拟相机有两个主要目标:
- Follow 目标指定一个 GameObject 供虚拟相机移动
- 指定 Follow 后,则虚拟相机位置会与跟随对象以 FollowOffset 偏移保持一致 (取决于 Body 配置)
- LookAt 目标指定要瞄准的 GameObject
- 指定 LookAt 后,则虚拟相机朝向会始终朝向于 LookAt 对象 (取决于 Aim 配置)
主要参数有 Aim、Body 和 Noise 的配置,用于指定虚拟相机如何为位置、旋转和其它属性设置动画
- 当 Cinemachine Brain 或 Timeline 将 Unity 摄像机的控制权转移到虚拟摄像机时,虚拟摄像机将这些设置应用于 Unity 摄像机
- 在任何时候,每个虚拟相机都可能处于以下状态之一:
- Live:Virtual Camera 主动控制具有 Cinemachine Brain 的 Unity 摄像机。当 Cinemachine Brain 从一个虚拟摄像机混合到另一个虚拟摄像机时,两个虚拟摄像机都是活动的,混合完成后,只有一个活动虚拟摄像机
- Standby:Virtual Camera 不控制 Unity 相机,但仍然跟随并瞄准目标,并在每一帧更新。处于此状态的虚拟摄像头已激活,其优先级与实时虚拟摄像头相同或更低
- Disabled:Virtual Camera 不控制 Unity 相机并且不主动跟随或瞄准其目标。这种状态下的虚拟相机没有性能消耗,停用其游戏对象即可禁用。不过即使禁用,如果参与混合或者被 Timeline 调用,虚拟相机仍然可以控制 Unity 相机
Cinemachine 包括各种算法来控制移动和瞄准,每个算法都解决一个特定的问题,并且如果有特殊需要也可以进行自定义
- Cinemachine 将这些算法实现为 CinemachineComponent 对象,可使用 CinemachineComponent 类来实现自定义移动或瞄准行为
Body 配置提供了以下用于在场景中移动虚拟相机的算法:
- Transposer (默认):以与 Follow 目标的固定关系移动,具有可选的阻尼
- 3rd Person follow:围绕玩家水平和垂直旋转的相机,指向跟随目标
- Do Nothing:虚拟相机不会跟随移动 (但是会瞄准)
- Framing Transposer:以固定的屏幕空间关系移动到 Follow 目标,可选择阻尼
- Orbital Transposer:以可变关系移动到 Follow 目标,可选择接受玩家输入
- Tracked Dolly:沿着预定义的路径移动
- Hard Lock to Target:将相机位置设置为与跟随目标一致
Aim 配置提供了以下用于旋转虚拟相机以面向 LookAt 目标的程序算法:
- Composer:将 Look At 目标保持在相机框架中,并具有构图限制
- Group Composer:在相机画面中保留多个 Look At 目标
- Do Nothing:不旋转虚拟相机
- POV:根据用户的输入旋转虚拟相机
- Same As Follow Target:将相机的旋转设置为跟随目标的旋转
- Hard Look At:将注视目标保持在相机框架的中心
# 主要属性
- Solo:似乎只是编辑器使用,可以暂时切换到当前的这个虚拟相机进行预览
- Game Window Guides:在游戏视图中切换构图提示框的可见性 (就是点开 Aim 之后的区域显示)
- Save During Play:选中以在播放模式下应用更改,使用此功能可以播放模式直接微调虚拟相机,这是一个全局属性,适用于所有虚拟相机
- Priority:此虚拟相机对于下一个镜头选择的重要程度,较高的值表示较高的优先级。
- Cinemachine Brain 从所有激活的虚拟摄像机中选择下一个实时虚拟摄像机,并且与当前实时虚拟摄像机具有相同或更高的优先级。使用带 Timeline 控制时,此属性无效
- Follow:跟随目标对象,Body 属性使用此目标来更新 Unity 相机的位置。将此属性留空可以手动控制虚拟相机变换的位置,例如在 Timeline 中为虚拟相机设置动画
- Look At:瞄准的目标对象。 Aim 属性使用此目标来更新 Unity 相机的旋转
- Standby Update:控制虚拟相机不活动时更新频率
- Position Blending:与此虚拟相机混合位置的方式
- Linear (线性)
- Spherical (球形):如果有注视目标,则围绕注视位置进行球形混合
- Cylindrical (圆柱形):如果有注视目标,则围绕注视位置进行圆柱混合,垂直坐标被线性插值
- Lens:在 Unity 相机属性中的对应项
- Field Of View
- Presets:常用镜头预设,可以点击下拉菜单选择或保存
- Orthographic Size:使用的 Unity 相机是正交相机时有用
- Near Clip Plane
- Far Clip Plane
- Dutch (荷兰角度 / 斜角镜头):将相机相对于场景倾斜,以度为单位在 z 轴上倾斜 Unity 相机。此属性是虚拟相机独有的
- Mode Override:当 Cinemachine 激活此虚拟摄像机时,允许选择不同的摄像机模式应用于 Unity 摄像机
- None
- Orthographic:正交相机模式
- Perspective:透视相机模式
- Physical:物理相机模式
- Blend Hint:混入或混出虚拟相机位置的提示(暂时不知道具体做什么)
- Inherit Position:启用后,只要此虚拟摄像机活动,就会强制初始位置与 Unity 摄像机的当前位置相同(如果可能)
- Extensions:向虚拟相机添加额外行为的组件
- Cinemachine 自带了部分扩展,继承 CinemachineExtension 类可以创建自己的自定义扩展
# Body properties
使用 Body 属性指定在场景中移动虚拟相机的方法
# 3rd Person Follow
第三人称跟随会将相机保持在相对于 Follow 目标的恒定位置和距离,跟踪目标的移动和旋转,并直接提供了相机与目标间的障碍检测功能。
- ShoulderOffset:如同名字一样,偏移
- 当其 X 值有值的时候,后续 CameraSide 才有效
- CameraSide:当 ShoulderOffset X 轴有值时,该项才有效,影响往左偏还是往右偏 (0~1)
- 实测若 0.5 则不变,也就是居中,当这个不为 0.5 时,ShoulderOffset X 才有效
- Vertical Arm Length:手相对于肩的垂直偏移。当相机垂直旋转时,臂长会影响跟随目标的屏幕位置,对于第一人称相机,这可以设置为 0
- Camera Radius:指定相机在不调整其位置的情况下可以接近可碰撞障碍物的距离
- Damping Into Collision:指定相机如何移动以校正遮挡,数字越大越慢
- Damping From Collision:返回正常位置速度,数字越大,相机恢复速度越慢
# Framing Transposer
专为 2D 和正交相机而设计
- 这种虚拟相机机身算法将相机以固定的屏幕空间关系移动到跟随目标
- 还可以指定偏移量、阻尼和合成规则
- Framing Transposer 仅更改相机在空间中的位置,不会重新定向或以其他方式瞄准相机
- 注 1:Framing Transposer 忽略 LookAt 目标 - 仅使用 Follow 目标,如果同时使用了 Aim 相关操作可能会有冲突
- 注 2:Framing Transposer 专为 2D 和正交相机而设计,但它也适用于透视相机和 3D 环境
- 该算法首先沿相机 Z 轴移动相机,直到 Follow 目标与相机的 X-Y 平面相距达到所需的距离。然后它在 X-Y 平面中移动相机,直到跟随目标位于相机屏幕上的所需点
主要属性
- Lookahead Time
- 根据目标的运动调整虚拟相机与跟随目标的偏移量
- Cinemachine 预测目标将在未来这么多秒的时间点
- 此功能对嘈杂的动画很敏感,会放大噪音,从而导致不良的相机抖动。如果在目标运动时相机抖动不可接受,请调低此属性,或使目标动画更平滑
- Lookahead Smoothing
- 预测算法的平滑度。较大的值可以消除抖动的预测并增加预测滞后
- Screen X/Y:相机跟随目标的屏幕位置
- Camera Distance:跟踪距离
- Dead Zone Width/Height:在此范围时,不移动相机
- Dead Zone Depth:如果跟随目标与相机距离在此距离内,不沿其 z 轴移动相机
- Soft Zone Width/Height:当目标在此范围内时,移动相机以将目标框在 DeadZone 内,阻尼属性影响相机移动的速率
- Bias X/Y:软区的中心的偏移
# Hard Lock to Target
将虚拟相机机身直接设置为 Follow 目标的位置
- 换句话说,目标充当虚拟相机的安装点
# Orbital (轨道) Transposer
可以选择接受玩家输入,允许玩家动态控制相机相对于目标的位置
这种虚拟相机机身算法将 Unity 相机移动到虚拟相机的跟随目标的可变关系中
- 看着是绕目标的一个『圆环』轨道
- 可以设置移动限制角度范围,可选超出则停止或 Wrap 到另一个角度
- Orbital Transposer 引入了航向的概念,即目标移动或面向的方向
- Orbital Transposer 尝试定位相机,使其指向与前进方向相同的方向
- 默认情况下,此位置位于目标的正后方,可通过调整 Heading->Bias 属性来控制这种关系
- Heading:指定如何计算 Follow 目标的航向
- Definition
- Position Delta:根据上次更新和当前帧的目标位置差异计算航向
- Velocity:选择速度以使用目标刚体的速度,如果目标没有 Rigidbody 组件,则恢复为 Position Delta
- Target Forward:使用目标的本地 Forward 轴作为航向
- World Forward:使用恒定的世界空间 Forward 作为航向
- Velocity Filter Strength:在定义中使用 Position Delta 或 Velocity 时控制速度的平滑度
- Bias:相对于航向放置相机的轨道中的角度偏移,以度为单位
- Definition
- Recenter To Target Heading:勾选后,当玩家没有输入时控制自动重新居中
- 注:当 Definition 选 Position Delta 或 Velocity 时可能没用
- X Axis:航向控制,此处的设置控制相机响应玩家输入的行为
- Wrap:如果选中,则轴在最小值和最大值处环绕,形成一个循环
- Speed Mode:轴如何响应输入
- MaxSpeed(默认值):限制轴可以改变的最大速度,与输入无关
- InputValueGain:将输入值乘以 MaxSpeed
- Invert:反向
# Tracked Dolly
- 限制虚拟相机沿预定义路径移动,使用路径位置属性指定将虚拟相机放置在路径上的位置
- 使用 Auto-Dolly 模式将虚拟相机移动到路径上最接近 Follow 目标的位置。启用后,Auto-Dolly 会自动将虚拟相机的位置动画化到路径上最接近目标的位置
- 注:提示:使用 Auto-Dolly 模式时请谨慎选择路径形状,这在围绕某个点形成弧形的路径上会出现问题。作为一个极端的例子,考虑一个以 Follow 目标为中心的完美圆形路径。路径上的最近点变得不稳定,因为圆形路径上的所有点都同样接近目标,在这种情况下,将 Follow 目标移动一小段距离会导致相机在轨道上移动很远的距离
- Path Position:沿路径放置相机的位置,可直接设置或启用 Auto-Dolly,采用 Position Units 指定的单位
- Position Units:路径位置的度量单位
- Path Units:沿途使用路标,值 0 表示路径上的第一个路点,1 表示第二个路点,依此类推
- Distance:使用沿路径的距离
- Normalized:值 0 表示路径的开始,1 表示路径的结束
- Path Offset:相机相对于路径的位置偏移
- X/Y/Z Damping:移动阻尼,影响移动速度,越大越慢
- Camera Up:如何为虚拟相机设置朝向
- Default:不修改虚拟相机的朝向,但会使用 Cinemachine Brain 中的 World Up Override 属性控制 (如果有的话)
- Path:在当前点使用路径的朝向
- Path No Roll:在当前点使用路径的朝向,但不旋转校正
- Follow Target:使用 Follow 目标变换中的朝向
- Follow Target No Roll:使用来自 Follow 目标变换的向上矢量,但不旋转校正
- Pitch/Yaw/Roll Damping:旋转阻尼,小数字使相机更灵敏,数字越大,相机响应越慢
- Auto Dolly:控制如何自动移动相机,使用此功能需要有 Follow target
- Enabled:启用自动移动
- 注意:这可能会对性能产生一些影响,具体取决于 Search Resolution 参数
- Position Offset:从路径上最近的点到跟随目标的偏移量,以 Position Units 为单位
- Search Radius:当前段两侧的段数。对整个路径使用 0。当路径的形状相对于目标位置导致路径上的最近点变得不稳定时,使用较小的数字
- Search Resolution:Cinemachine 通过将路径分成许多直线片段来搜索,数字越大,结果越准确。数值越高性能消耗也越大
- 注:该功能可以配合 DollyCart 使用(Cinemachine->DollyTrackWithCart,DollyCart 能够自动跟随路径点移动),再配合循环路点就可以无限环绕了
- Enabled:启用自动移动
# Cinemachine Path
- 是一个定义世界空间路径的组件,由一组路径点组成
- 使用 Bezier 插值来计算路点之间的位置以获得平滑且连续的路径,路径经过所有路点
- 可调整的控制属性相对 SmoothPath 更多
- 主要属性
- Resolution:路径采样分辨率
- Looped:使路径循环封闭
- Selected Waypoint:当前选中路径点的属性信息
- Prefer Tangent Drag:当切线和位置的 Gizmo 在场景视图中重合时,选中以使用 Gizmo 作为路点的切线
- Path Details
- Position:路径局部空间中的位置(即相对于路径对象本身)
- Tangent:与位置的偏移量,它定义了路径点处曲线的切线
- Roll:此路点的路径旋转,其他方向轴是从切线和 World Up 推断出来的(影响不会传递给其它路径点,只影响该路径点相连的两条边)
# Cinemachine Smooth Path (推荐)
- 是一个定义世界空间路径的组件,由一组路点组成
- 使用 Bezier 插值来计算路点之间的位置以获得平滑且连续的路径,路径经过所有路点
- 与 Cinemachine Path 不同,一阶和二阶连续性得到保证,这意味着不仅位置而且沿路径动画的对象的角速度都将是平滑和连续的,但也因此使我们对路径位置的控制更少
- 主要属性
- Waypoints:定义的所有路径点列表,使用贝塞尔曲线进行插值
- Position:路径点在在局部路径空间中的位置
- Roll:此路点的路径旋转,其他方向轴是从切线和 World Up 推断出来的(影响会传递给其它路径点)
- Waypoints:定义的所有路径点列表,使用贝塞尔曲线进行插值
注:可以设置为循环路点
# Cinemachine Dolly Cart
CinemachineDollyCart 是一个组件,可使用它沿着 Cinemachine Path 或 Cinemachine Smooth Path 路径为游戏对象设置路径移动动画,或作为虚拟相机的跟随目标
主要属性
- Path:路径
- Update Method:当速度不为零时何时移动,使用 Update 进行正常的 MonoBehaviour 更新,使用 Fixed Update 进行与物理模块 FixedUpdate () 同步的更新,或 LateUpdate
- Position Units:位置的度量单位
- Path Units:沿途使用路标,值 0 表示路径上的第一个路点,1 表示第二个路点,依此类推
- Distance:使用沿路径的距离,根据路径的 Resolution 属性对路径进行采样。,Cinemachine 会创建一个距离查找表并存储在内部缓存中
- Normalized:使用归一化 0~1 作为首尾
- Speed:以此速度移动,该值根据 PositionUnits 进行解释
- Position:当前处于路径中的位置,可以直接设置动画,或者如果速度不为零,将自动更新,该值根据 PositionUnits 进行解释
# Transposer
该算法将虚拟相机以固定偏移量移动到跟随目标,可应用阻尼
- 固定偏移量可以有多种模式选择
参数
- Binding Modes:绑定模式定义了 Unity 用来解释相机与目标的偏移量和阻尼的坐标空间
- Lock To Target:使虚拟相机使用 Follow 目标的本地坐标,当目标旋转时,相机也随之旋转以保持偏移并保持目标的相同视图
- Lock To Target No Roll:使虚拟相机使用 Follow 目标的本地坐标,但不进行 Roll 的旋转 (实测是不受对象的 Z 轴旋转了)
- Lock To Target On Assign:在激活虚拟相机或分配目标时,使虚拟相机的方向与 Follow 目标的局部坐标匹配。此偏移量在世界空间中保持不变。相机不随目标旋转
- Lock To Target With World Up:使虚拟相机使用倾斜和滚动为 0 的跟随方式,此绑定模式忽略除 Yaw 之外的所有目标旋转
- World Space:偏移量在世界空间中解释为相对于跟随目标的原点,目标旋转时相机不会改变位置
- Simple Follow With World Up:此模式模拟人类摄像师在被指示跟随目标时将采取的行动,相机尝试尽可能少地移动以与目标保持相同的距离;相机相对于目标的方向无关紧要。无论目标的方向如何,相机都会尝试与其保持相同的距离和高度
- https://docs.unity3d.com/Packages/com.unity.cinemachine@2.8/manual/CinemachineBindingModes.html
- Follow Offset:相对于跟随目标的距离
- X/Y/Z Damping:响应阻尼
- Pitch/Yaw/Roll Damping:旋转阻尼
# Aim properties
使用该属性下的设置指定虚拟相机如何旋转
# Do Nothing
本身什么都不做,可以用于静态镜头或直接使用自定义脚本设置旋转动画
# Composer
此虚拟相机始终旋转相机以面向注视目标
- Center On Activate:选中后,当相机变为活动状态时,强制相机位于屏幕中央,否则位于最近的 DeadZone 边缘
- Tracked Object Offset:从 Look At 目标的中心偏移,可用于当所需区域不是被跟踪对象的中心时,微调跟踪目标位置
- Lookahead Time:根据注视目标的运动调整偏移量,该算法预估目标将在未来指定时间运动 (秒)
- 测试:随着值的增加,当物体运动时,追踪的中心点变了,处于预估位置
- 此功能对嘈杂的动画很敏感。它会放大噪声,导致不希望出现的相机抖动。如果在目标运动时相机抖动不可接受,请调低此属性或使目标动画更平滑
- Lookahead Smoothing:控制 Lookahead Time 算法的平滑度,较大的值可以消除预测抖动并增加预测滞后
- Lookahead Ignore Y:预测计算忽略沿 Y 轴的移动
- Horizontal/Vertical Damping:相机在屏幕方向上跟随目标的响应速度,较小的数字会让相机旋转更灵敏、快速,以将目标保持在 DeadZone 内。对更重、响应更慢的相机使用更大的数字
- Screen X/Y:DeadZone 中心的屏幕位置,摄像机旋转保持目标处于这里
- Dead Zone Width/Height:在该区域中相机忽略目标的任何移动,也不会更新其旋转。这对于忽略较小的目标移动很有用
- Soft Zone Width/Height:如果目标出现在屏幕的这个区域,相机将旋转以将保持于 DeadZone
- Bias X/Y:SoftZone 相对于 DeadZone 的偏移
# Group Composer
这种 Virtual Camera Aim 算法将相机瞄准多个游戏对象
- 它的行为与 Composer 相同并且具有相同的设置
- 如果 Look At 目标是 Cinemachine Target Group,可以调整 FOV 和摄像机距离,以确保正确瞄准目标组
# Cinemachine Target Group
使用 Cinemachine Target Group 将多个游戏对象视为单个 Look At 目标, Target Group 与虚拟相机 Group Composer 算法结合使用
- Position Mode
- Group Center:使用包含目标组所有对象的轴对齐边界框的中心
- Group Average:使用目标组中各个对象位置的加权平均值
- Rotation Mode
- Manual:使用目标组变换的旋转属性中指定的值 (推荐)
- Group Average:目标组中所有对象方向的加权平均值
- Update Method
- Update:在正常的 MonoBehaviour Update () 方法中更新
- Fixed Update:在 FixedUpdate () 中与物理模块同步更新
- Late Update:在 MonoBehaviour LateUpdate () 中更新
- Targets
- Weight:对象权重,不能为负
- Radius:对象半径,用于计算边界框,不能为负
# Hard Look At
旋转虚拟相机以将注视目标始终保持在相机框架的中心
# POV
这种 Virtual Camera Aim 算法会根据用户的输入来控制相机旋转
- Vertical/Horizontal Axis:控制虚拟相机旋转
- Value:当前相机瞄准的轴的度数,以度为单位。可接受的值为 -90 到 90
- Value Range:虚拟相机垂直轴可允许旋转的最小和最大度数
- Wrap:如果选中,轴环绕 ValueRange 范围形成一个循环
- Speed Mode:轴如何响应输入
- MaxSpeed(默认值):限制轴可以改变的最大速度,与输入无关
- InputValueGain:将输入值乘以 MaxSpeed
- Accel Time:加速时间
- Decel Time:减速时间
- Input Axis Name:在 Unity 输入管理器中指定的该轴的名称,要禁用则将此属性设置为空字符串
- Input Axis Value:输入轴的值。值为 0 表示没有输入,可以直接从自定义输入系统驱动它,或者也可以设置输入轴名称并让值由 Unity 输入管理器驱动
- Invert:在使用 InputAxisName 输入的值之前反转原始值
- Vertical/Horizontal Recentering:当玩家没有输入时控制自动返回居中
# Same As Follow Target
与目标旋转保持一致
- 当与 Body 属性中的 Hard Lock to Target 算法一起使用时,该算法使虚拟相机匹配控件 GameObject 的路径和旋转
# Noise:使用噪声模拟相机抖动
现实世界中的物理相机一般比较笨重,由摄像师手持或安装在例如移动的车辆等不稳定的物体上
可以使用噪声属性来模拟这些真实世界的效果:例如在跟随奔跑的角色时添加相机抖动
- 在每次帧更新时,Cinemachine 都会添加与摄像机运动分开的噪声以跟随目标
- 噪声不会影响相机在未来帧中的位置,这种分离可确保阻尼等属性按预期运行
Cinemachine 包含一个基本多通道 Perlin 组件,可以将 Perlin 噪声添加到虚拟摄像机的运动中
# 属性设置
- Noise Profile:要使用的噪声配置文件资产
- Amplitude Gain:应用于噪声曲线中定义的振幅的增益
- 使用 1 以使用噪声配置文件中定义的振幅,将此设置为 0 可禁用
- 提示:设置此属性的动画可使噪声效果上下倾斜
- Frequency Gain:应用于噪声配置文件中定义的频率的系数
- 使用 1 以使用噪声配置文件中定义的频率
- 使用较大的值可以更快地摇动相机
- 提示:设置此属性的动画可使噪声效果上下倾斜
- Pivot Offset:旋转相机时,在应用旋转噪声时将相机的枢轴偏移指定的 x、y 和 z 距离。这会产生一些与旋转噪声相对应的位置变化
# 噪声配置文件
噪声配置文件是定义相机噪声程序曲线的资源
- Basic Multi Channel Perlin 组件将噪声配置文件应用于相机的移动, Cinemachine 在计算出摄像机的位置后应用噪声移动
- 可以设置位置、旋转的振幅、频率以合成随机噪声效果
注:
- 对于振幅,对更宽的镜头使用更大的值以显着地抖动相机。对于长焦镜头,使用较小的振幅值,因为较窄的 FOV 会放大效果
- 对于频率,典型的低频范围为 0.1-0.5 Hz,中频范围为 0.8-1.5,高频范围为 3-4。最高有用频率取决于游戏的帧速率。游戏通常以 30 或 60Hz 运行,高于游戏帧速率的噪声频率介于奈奎斯特速率之间。换句话说,它们不会被直接跟踪
- 例如,如果游戏以 60 帧 / 秒的速度运行并且将频率设置为 100,将获得不连贯的相机噪音
- 这是因为游戏无法渲染比帧速率更快的物体
参数
- Preview Time:在检查器的图形中显示的秒数,用于编辑时在检查器中预览时长
- Preview Height:预览框高度
- Animated:预览噪声波动的移动表示
- Position Noise:相机移动的所有轴的所有噪声层的图形表示
- Frequency:噪声层中波的频率,以 Hz 为单位
- Amplitude:噪声层中波的振幅(高度),以距离为单位
- Non-random wave if checked:选中以从噪声层中移除 Perlin 噪声 (随机化频率和振幅,同时保持在所选值的附近),没有 Perlin 噪声会使用常规正弦波
- Rotation Noise:相机旋转所有轴的所有噪声层的图形表示(设置同位置)
# 虚拟相机之间的混合
使用混合属性指定 CinemachineBrain 组件如何在虚拟摄像机之间执行混合
- Cinemachine 混合不是淡入淡出、擦除或溶解,而是执行从一个虚拟摄像机到下一个虚拟摄像机时 Unity 摄像机的位置、旋转和其他设置的平滑动画
- 对于特定虚拟摄像机之间的混合,使用 CinemachineBrain 组件中的自定义混合列表,使用 CinemachineBrain 中的默认混合属性来指定没有自定义混合的虚拟摄像机之间的混合
- From 和 To 设置是基于名称的,而不是引用
- 这意味着 Cinemachine 通过将名称与设置相匹配来查找摄像机,而非链接到特定的游戏对象,内置下拉菜单可用于从当前场景中选择虚拟摄像机,或者直接在文本框中输入名称,如果名称与当前场景中的任何虚拟摄像机都不匹配,则该字段将以黄色突出显示
- 当 Cinemachine 开始从一个虚拟摄像机过渡到另一个虚拟摄像机时,它将在此资设置中查找与即将到来的过渡相匹配的条目,并应用该混合定义
- 如果未找到,则将应用 CinemachineBrain 的 DefaultBlend 设置
- 如果在资产设置中找到读个匹配,Cinemachine 将选择具有最强特异性的一个。例如,如果从 vcam1 混合到 vcam2,并且自定义混合资产包含 vcam1-to-AnyCamera 的条目和 vcam1-to-vcam2 的另一个条目,则 vcam1-to-vcam2 条目将适用
- 如果 Custom Blends 资产中的多个条目与即将到来的过渡具有同样强烈的特异性,那么找到的第一个将适用
# 属性
- From:要混合的虚拟摄像机的名称。使用名称 ANY CAMERA 从任何虚拟相机进行混合。此属性仅适用于自定义混合
- To:要混合到的虚拟摄像机的名称。使用名称 ANY CAMERA 混合到任何虚拟相机。此属性仅适用于自定义混合
- Style Default Blend:混合曲线
- Cut:没有混合,直接切换
- Ease In Out:S 型曲线,过渡平缓流畅
- Ease In:从传出的虚拟摄像机中线性 (Linear) 淡出,并缓和到混入新的虚拟摄像机中
- Ease Out:缓和淡出虚拟摄像机,并线性混合到新的虚拟摄像机中
- Hard In:从旧的虚拟摄像机中缓出,并加速进入新的虚拟摄像机
- Hard Out:加速离开旧的的虚拟摄像机,并缓缓进入新的虚拟摄像机
- Linear:线性混合
- Custom:自定义曲线
- Time:混合的持续时间(以秒为单位)
# Composing a shot(拍摄视图)
Framing Transposer、Composer 和 Group Composer 算法定义相机框架中的区域,以供构图:
- 空区 (Dead zone):Cinemachine 将目标保留在画面中的区域
- 软区 (Soft zone):如果目标进入画面的这个区域,相机将重新定向以将其放回盲区。根据阻尼设置中指定的时间,它会缓慢或快速地执行此操作
- 屏幕 (Screen):死区中心的屏幕位置。 0.5 是屏幕的中心。
- 阻尼 (Damping):模拟真实摄像师在操作重型物理摄像头时引入的滞后。阻尼指定相机在跟踪目标时目标进入软区时快速或缓慢地做出反应。使用较小的数字来模拟更灵敏的相机,快速移动或瞄准相机以将目标保持在盲区内。较大的数字模拟较重的摄像机,值越大,Cinemachine 越允许目标进入软区
如上图所示:
- 空白区域表示空区 (Dead zone)
- (没大明白)
- 蓝色区域表示软区 (Soft zone)
- 红色区域表示目标永远不会进入的禁区,黄色方块表示目标
调整这些区域可以获得各种相机行为,例如使用更大的阻尼值来模拟更大、更重的相机,或者扩大软区和死区以在相机框架的中间创建一个不受目标运动影响的区域。例如用于动画循环之类的事情、比如如果不希望目标移动一点点相机就跟踪目标
# 分组虚拟像机
分组摄像机可以同时管理多个虚拟摄像机,但从 CinemachineBrain 和 TimeLine 的角度来看,只将其当做单个虚拟摄像机对象
# FreeLook Camera
该组件可以接受玩家输入
Cinemachine Free Look Camera 组件提供第三人称视角的相机体验
- 该组件沿着由三个独立的摄像机装置指定的位置围绕其主体运行:顶部、中部和底部
- 三个部位,每个部位都定义一个围绕目标的环,具有自己独立的设置,与常规虚拟相机的属性相同
- 接受玩家输入时,会根据对应输入在轨道之间进行混合
沿 x 轴和 y 轴使用玩家输入
- x 轴控制沿着顶部、中间或底部水平轨道的轨道位置,就像轨道转置器一样
- y 轴控制垂直位置,使用样条曲线确定相机之间的位置
整体上是一个圆环,可视作处于目标周围一个圆的表面的移动
主要属性
- Binding Modes:同 Transposer 的模式
- Spline Curvature:连接钻机轨道的线的曲率,这条线决定了 y 轴上的最终位置
- Height, Radius:Top、Middle 和 Bottom 三个环相对于 Follow 目标的半径和高度
# Cinemachine Mixing Camera
Cinemachine 混合摄像机组件使用其子虚拟摄像机的加权平均值来计算 Unity 摄像机的位置和其他属性
Mixing Camera 最多管理八个子虚拟摄像机,通过场景右键创建时,会自动添加两个子虚拟相机
- 在 Mixing Camera 组件中,这些 Virtual Cameras 是固定的插槽,而不是动态数组
- Mixing Camera 使用此实现来支持 Timeline 中的权重动画,Timeline 不能为数组元素设置动画
主要属性
- Child Camera Weights:虚拟相机的重量,注意将一个相机的权重设置为 1 不会将其他权重设置为零。任何单个相机的权重贡献是它的权重除以所有子权重的总和
- Mix Result:子虚拟相机权重的图形表示,每个子相机的条形的浅色部分代表其对混合相机最终位置的贡献比例,当条形完全变暗时,摄像机对混合摄像机的位置将没有任何影响
# Cinemachine Blend List Camera
Cinemachine 混合列表摄像机组件在其子虚拟摄像机之间执行一系列混合或剪切
- 当混合列表相机被激活时,它会执行其指令列表,激活列表中的第一个子虚拟相机,保持指定的时间,然后剪切或混合到下一个子对象,依此类推
- 混合列表摄像机保留到最后一个虚拟摄像机,直到 CinemachineBrain 或时间轴停用混合列表摄像机
提示:使用 Blend List Camera 而不是 Timeline 以获得更简单的自动序列
通过场景右键创建时,会自动添加两个子虚拟相机
主要属性
- Follow:子虚拟相机移动的默认目标,当子虚拟相机没有指定跟踪目标时,BlendList 相机使用这个目标,如果子虚拟相机都定义了自己的目标,则可以为空
- LookAt:Unity 相机瞄准的默认目标,当子虚拟相机没有指定跟踪目标时,BlendList 相机使用这个目标,如果子虚拟相机都定义了自己的目标,则可以为空
- Loop:启用后,子虚拟摄像机将无限循环,而不是停在列表中的最后一个虚拟摄像机上
- Hold:到达位置后的停止时间,停止指定时间后继续
# Cinemachine Clear Shot Camera
该组件在其子虚拟相机中选择拍摄目标时,选取镜头质量最好的相机,使用 ClearShot 设置场景的复杂多摄像机覆盖范围,以保证目标的清晰视野
这个功能很强大,具有 CinemachineCollider 扩展的虚拟相机子项分析场景中的目标障碍物、最佳目标距离等, ClearShot 使用此信息来选择最适合激活的一个
- 如果多个子摄像头的镜头质量一样,Clear Shot 摄像头会选择优先级最高的一个
- 还可以定义清晰镜头子相机之间的自定义混合
注 1:『镜头质量』应该指没有被障碍物遮挡
注 1:如果想要为所有虚拟摄像机子项使用单个 CinemachineCollider,可以直接将 CinemachineCollider 扩展添加到 ClearShot 对象,而非每个子虚拟摄像机单独挂。这样这个 CinemachineCollider 扩展会适用于所有的子相机(如同每个相机都有个单独的 Collider 扩展一样)
- 通过场景创建的 ClearShotCamera 会创建一个子虚拟相机,默认创建的子相机会默认附带一个 CinemachineCollider,但是其 AvoidObstacles 默认是没有启用的!需要注意
主要属性
- Activate After:在当前相机已经不是最佳视野相机后 (碰到障碍物),至少等待指定时间才会切换到另外的相机
- Min Duration:在当前相机已经不是最佳视野相机后 (碰到障碍物),且该相机已经保持了指定时间,才可以切到新相机去
- Randomize Choice:如果多个虚拟摄像机的镜头质量相同,选择这些中的一个随机摄像机。否则使用子虚拟相机的顺序及其优先级为准
- Priority:优先级
# Cinemachine State-Driven Camera
状态驱动摄像机,该组件会在动画目标更改状态时激活子虚拟相机
- 例如,角色的本地运动系统和轨道相机
- 当角色跑动时相机晃动幅度更大会让游戏对玩家来说感觉更生动,而当其行走时,则使用阻尼值更大的虚拟相机
属性里的动画目标指的是一个由 AnimatorController 控制的 Animator 组件的对象
- 状态驱动相机有一个列表,可以将子虚拟相机分配给对应动画状态
主要属性
- Animated Target:包含 AnimatorController 的对象
- Layer:要在动画目标中检测的动画层
- State:虚拟相机将映射到的动画状态
- Wait:进入此状态后激活虚拟相机的延迟(以秒为单位),即新的动画状态激活时间指定时间后,相机才切换过去
- Min:虚拟相机在激活后必须保持活动状态的最短时间(以秒为单位)
# 相机扩展
扩展是增强虚拟相机行为的组件,Cinemachine 默认包含了一些扩展,也可以通过继承自 CinemachineExtension 类来创建自定义扩展
# 默认扩展
# Cinemachine Collider
碰撞处理
它对虚拟相机的最终位置进行后处理,以尝试与虚拟相机的目标保持清晰的视线,主要通过将相机推离阻挡视线的游戏对象来实现这一点
- 主要功能包括碰撞检测、镜头质量评估
- 注:使用 PhysicsRaycaster 进行碰撞检测
主要属性
- Collide Against:碰撞检测层级
- Transparent Layers:忽略的层级
- Ignore Tag:带有此标签的障碍物将被忽略
- Minimum Distance From Target:与跟踪目标的距离小于该数值的障碍物会被忽略
- Avoid Obstacles:选中后,在目标被障碍物遮挡时才会移动相机进行避障
- Distance Limit:经试验看着是 从相机到目标 发射射线的距离,配置 0 则直连无限制
- Camera Radius:检测到障碍物并进行避障时,与障碍物保持的距离
- Strategy:避障策略
- Pull Camera Forward:沿 Z 轴向前移动相机,直到它位于距离目标最近的障碍物前面
- Preserve Camera Height:将相机移动到另一个视角,同时尝试将相机保持在其原始高度
- Preserve Camera Distance:将相机移动到另一个视点,同时尝试将相机保持在与目标的原始距离(比如往左或往上之类的偏同样距离)
- Smoothing Time:将相机保持在离目标最近的点的最小时间,可用于在有很多障碍物的环境中减少相机的过度移动 (开启避障时可用)
- Damping:障碍消失后,将相机返回到正常位置的阻尼
- Damping When Occluded:移动相机以避开障碍物的阻尼
- Optimal Target Distance:如果大于零,则当目标更接近此距离时,镜头质量评分更高,将此属性设置为 0 可禁用此功能
- Minimum Occlusion Time:遮挡至少持续了指定时间才进行避障操作
- Maximum Effort:要处理的障碍物数量的上限,较高的数字可能会影响性能。在大多数环境中,四 (4) 次就足够了
# Cinemachine Confiner
使用该扩展将摄像机的位置限制在一个区域(对于正交相机,还有一个附加选项可以限制屏幕边缘)
主要属性
- Confine Mode:使用 2D bounding 或 3D bounding 进行操作
- Bounding Volume:一个 Collider 碰撞体
- Confine Screen Edges:在正交相机将屏幕边缘限制在该区域,未选中时仅限制相机中心(透视模式无效)
# Cinemachine Follow Zoom
此扩展调整镜头的 FOV,使目标物体在屏幕上保持恒定大小,而不管相机和目标位置如何
主要属性
- Width:在目标距离处以世界单位保持的视野宽度。将自动调整 FOV,使得不管两者距离如何,对象在视野中都具有同样的大小
- Min FOV:FOV 调整下限
- Max FOV:FOV 调整上限
# Cinemachine Pixel Perfect
Pixel Perfect Camera 和 Cinemachine 都会修改相机的正交尺寸,在一个场景中一起使用这两个系统会导致它们争夺对相机的控制权并产生不需要的结果,CinemachinePixelPerfect 扩展用于解决这种不兼容问题
- 注:
- Pixel Perfect Camera:2D Pixel Perfect 包中包含 Pixel Perfect Camera 组件,可确保像素图像在不同分辨率下始终保持锐利清晰,并在运动中保持稳定
- 看着是处理 2D Sprites 的
# Cinemachine Post Processing
该扩展用于将 Postprocessing V2 配置文件附加到虚拟摄像机
- 注:对于 HDRP 和 URP 7 及更高版本,PostProcessing 包已弃用,由 HDRP 和 URP 直接实现, URP 用 CinemachineVolumeSettings 扩展代替
# Cinemachine Volume Settings
使用该扩展可以将 HDRP/URP VolumeSettings 配置文件附加到虚拟摄像机
该扩展可以指定一个 VolumeSettingsProfile 资源,在激活时应用于虚拟摄像机。如果摄像机正在与另一个虚拟摄像机混合,则混合权重也会应用于设置效果
主要属性
- Focus Tracking:如果配置文件具有适当的重载,则会将基本焦距设置为从所选目标到相机的距离。然后 Focus Offset 字段将修改该距离
- None
- Look At Target :相对于 LookAt 目标的焦点偏移
- Follow Target:相对于 Follow 目标的焦点偏移
- Custom Target :相对于自定义目标的焦点偏移
- Camera:相对于相机的焦点偏移
- Focus Offset:当 Focus Tracking 不是 None 时有效,将最中心点从聚焦目标的位置偏移
- 要求后处理包括 DepthOfField
# Cinemachine Storyboard
Cinemachine Storyboard 在屏幕空间中将静止图像放置在 Unity 摄像机的输出之上,故事板可以简化动画,可以以故事版 (原画) 为基准,对场景进行构建
可随时使用 Storyboard 组件中的属性来隐藏和显示图像,并可以在全局级别禁用,以将其与 Unity 相机的实际渲染进行比较
主要属性
- Storyboard Global Mute:启用后,所有故事板都将全局禁用
- Show Image:切换故事板图像的可见性
- Aspect:图像显示模式
- Best Fit:保持垂直和水平比例,在不裁剪图像的情况下,将图像在屏幕上尽可能大地显示
- Crop Image To Fit:保持垂直和水平比例,调整图像大小以填满屏幕,必要时进行裁剪
- Stretch To Fit:调整图像大小以填满屏幕,必要时会拉伸填充
- Mute Camera:该项可以防止虚拟相机更新 Unity 相机,使用此功能可防止时间轴将相机混合到场景中的意外位置
- Waveform Monitor:打开波形监视器窗口
# Cinemachine 3rd Person Aim
这个扩展被认为是第三人称相机的一部分
为了保持瞄准精度,此扩展故意消除所有旋转噪音,并强制仔细瞄准目标点,不过如果噪声影响相机位置而不是旋转,那么相机位置噪声依然有效
- 如果 AimTargetReticle (准星) 不为空,则此扩展将从 Follow 目标的位置投射一条射线,并找到与该射线碰撞的第一个对象。然后,Aim Target Reticle 对象将被放置在游戏视图中的那个点上,以指示玩家在开枪时会击中什么
- 注:如果检测到的对象足够近以致于由于玩家和相机之间的偏移而受到视差的影响,则该点可能与相机所看到的不同
主要属性
- Aim Collision Filter:检测层
- Ignore Tag:忽略标签对象
- Aim Distance:物体检测射线投射多远
- Aim Target Reticle:是一个 2D 对象,将定位在游戏视图中的光线投射命中点(如果有)上方,或者如果未检测到命中点,则将保留在屏幕中央。可以为空,在这种情况下屏幕上不会出现指示符
# Cinemachine Recomposer
这个扩展是 CinemachineVirtualCamera 的附加模块,它为相机合成添加了最后的调整。主要用于 Timeline 的环境,如果希望在其中手动调整程序或记录的相机瞄准的输出的话
所有这些属性都可以在 Timeline 中进行动画处理
主要属性
- Apply After:当此虚拟相机处于活动状态时要激活的设置
- Body:相机已定位但尚未旋转时
- Aim:相机已旋转和定位,但未应用噪声或碰撞解决方案时
- Noise:已定位、旋转相机,并已应用噪点和其他校正后
- Finalize:在所有标准虚拟相机处理发生后应用
- Tilt:将垂直旋转添加到相机的当前旋转
- Pan:将水平旋转添加到相机的当前旋转
- Dutch:为当前相机的旋转添加倾斜(局部 Z 旋转)
- Zoom Scale:缩放当前相机视野 (FOV) 大小
- Follow Attachment:当该值小于 1 时,跟随目标的阻尼会增加,当该值为零时,阻尼是无限的
- Look At Attachment:当该值小于 1 时,注视目标 (旋转) 阻尼会增加,当该值为零时,阻尼是无限的
# Multiple Unity cameras
分屏和画中画效果需要使用多个 Unity 相机,每个 Unity 摄像机在玩家屏幕上呈现自己的视图
https://docs.unity3d.com/Packages/com.unity.cinemachine@2.8/manual/CinemachineMultipleCameras.html
注意将 Culling Mask 设置为适当的层
# Cinemachine Brain
属于 Unity 相机上的一个组件,用于监控场景中所有活动的虚拟相机
将虚拟摄像机或其他 Cinemachine 对象添加到场景时,如果 Unity 相机上尚无 Cinemachine Brain 组件,Unity 会自动添加一个
如果想切换到下一个虚拟相机,可以激活或禁用对应的虚拟相机对象,Cinemachine Brain 会选择最近激活的虚拟相机,并在之前虚拟相机和新激活的虚拟相机之前进行剪切或混合
- 注 1:可以利用 Cinemachine Brain 实时响应动态游戏事件,在游戏逻辑中控制优先级,这对于实时游戏玩法特别有用,因为其中的动作并不总是可以预测的
- 注 2:使用 Timeline 在可预测的情况下编排摄像机,例如过场动画。 Timeline 覆盖 Cinemachine Brain 优先级系统,提供精确的帧摄像机控制
注:使用 Timeline 控制虚拟相机时,Timeline 会覆盖 CinemachineBrain 做出的决定
主要属性
- Blend Update Method:何时混合并更新主相机
- Late Update:在 MonoBehaviour LateUpdate 中 (默认)
- Fixed Update:仅当更新方法为 FixedUpdate 并且在混合时看到抖动时才使用此设置
- Default Blend:当没有明确定义两个虚拟相机之间的混合时使用的默认混合方式
- Custom Blends:包含场景中特定虚拟相机 (取决于名字) 之间混合的自定义设置的资源引用
- Camera Cut Event:当虚拟相机激活并且没有混合时会触发此事件
- Camera Activated Event:当虚拟相机激活时会触发此事件,如果涉及混合,则事件会在混合的第一帧触发
# Cinemachine and Timeline
使用时间轴在虚拟相机之间激活、停用和混合。在时间轴中,将 Cinemachine 与其他游戏对象和资产相结合,以交互方式实现和调整丰富的过场动画,甚至是交互式过场动画。
- 注:对于简单的镜头序列,最好使用 Cinemachine Blend List Camera 而不是 Timeline
Timeline 会覆盖 CinemachineBrain 做出的基于优先级的决定,当 Timeline 结束时,控制返回给 CinemachineBrain
- 可以使用 CinemachineShotClip 控制 Timeline 中的虚拟摄像机,每个镜头剪辑都指向一个虚拟相机以激活然后停用,使用一系列镜头剪辑来指定每个镜头的顺序和持续时间
- 将 Clip 彼此相邻放置可以在两个虚拟摄像机之间切换,重叠 Clip 可以在两个虚拟摄像机之间混合
创建
- 在场景中创建一个空的 GameObject,它可以作为创建时间轴资源和实例
- 在场景中选择对象,点击 Timeline 窗口的 Create 可以创建一个本地资源
- 可以单击锁按钮锁定 TImeline 窗口,以便更轻松地添加和调整轨道
- 将带有 CinemachineBrain 组件的 Unity 摄像机拖到时间轴编辑器上,然后从下拉菜单中选择 “Create Cinemachine Track”
将 CinemachineShotClips 添加到 Cinemachine 轨道:
- 在 CinemachineTrack 中,右键单击并选择 Add Cinemachine Shot Clip
- 执行以下操作之一:
- 将已存在的虚拟相机添加到引用上
- 点击 Create 创建一个新的相机
- 在时间轴编辑器中,调整镜头剪辑的顺序、持续时间、剪切和混合
- 调整虚拟相机的属性以将其放置在场景中并指定瞄准或跟随的目标
- 要为 VirtualCamera 的属性设置动画,需要为其创建一个 AnimationTrack 并像任何其他 GameObject 一样设置动画
- 组织 Timeline 轨道以微调场景
# Top-down games
Cinemachine Virtual Cameras 以人类摄像机操作者及其操作真实摄像机的方式为蓝本
- 因此,它们对上 / 下轴很敏感,并且总是尽量避免将滚动 (Roll 旋转) 引入相机取景
- 由于这种敏感性,虚拟相机避免长时间直线上升或下降。如果 Look At 目标长时间直线上升或下降,那么将不会始终得到所需的结果
如果目的是构建一个 Top-down 的游戏,其中摄像机直接向下看,最佳做法是重新定义向上的方向,以供摄像机使用。为此可以将 CinemachineBrain 中的 WorldUpOverride 属性设置为一个游戏对象,该对象的本地向上指向希望虚拟摄像机正常向上的方向,这适用于该 CinemachineBrain 控制的所有虚拟摄像机
# Alternative Input Systems
一些 Cinemachine 组件(例如 FreeLook、POV、OrbitalTransposer)需要用户输入来定位或定向摄像机
默认情况下,Cinemachine 通过查询标准 Unity Input.GetAxis (name) 获取用户输入
- Cinemachine 定义了一个接口:Cinemachine.AxisState.IInputAxisProvider
- 如果将实现此接口的 MonoBehaviour 添加到虚拟相机或 FreeLook,则将调用自定义的脚本输入而不是标准输入系统
CinemachineInputProvider 是一个输入源重载,它会使虚拟相机使用新的 UnityEngine.Input 包而不是标准的 Unity 输入系统来获取输入,当项目中安装了 UnityEngine.Input 包时可用
# Cinemachine Impulse
Cinemachine Impulse 生成并管理相机抖动以响应游戏事件
- 例如使用 Impulse 在一个 GameObject 与另一个 GameObject 发生碰撞或场景中的某物爆炸时使 CinemachineVirtualCamera 抖动
Impulse 分为三部分:
- Raw vibration signal:多达 6 个维度的振动曲线:X、Y、Z、pitch、roll、yaw
- Impulse Source:从场景空间中的一个点发出原始振动信号的组件,并定义信号特征,如持续时间、强度和范围
- ImpulseListener:一种 Cinemachine 扩展,允许虚拟摄像机侦测到脉冲信号,并通过震动对其做出反应
要在场景中设置和使用 Impulse,请执行以下操作:
- 将 Cinemachine Impulse Source 或 Cinemachine Collision Impulse Source 组件添加到一个或多个要触发相机震动的游戏对象
- 将原始信号连接到脉冲源,这些可以是 6D 噪声配置文件、3D 固定信号或自定义信号类型
- 将 Cinemachine Impulse Listener 扩展添加到一个或多个 Cinemachine 虚拟摄像机,以便它们可以检测脉冲并对其做出反应
- 注:不能直接 AddComponent 添加,而得在虚拟相机的 AddExtension 添加才有效,试了好一会才发现问题
# Cinemachine Impulse Sources
脉冲源是从场景空间中的一个点发出振动信号的组件,游戏事件可以导致脉冲源从事件发生的地方发出信号,事件触发脉冲源,脉冲源产生脉冲,带有 Impulse Listener 扩展的虚拟摄像机通过震动对脉冲做出反应
自带两种脉冲源组件:
- Cinemachine Collision Impulse Source:对象碰撞或触发区域触发脉冲生成
- Cinemachine Impulse Source:碰撞以外的事件触发脉冲
使用示例
- 巨人的每只脚上,使巨人走路时地面震动
- 在击中目标时爆炸的射弹上
- 在 gelatin planet 的表面上,当有东西接触到它时会摇晃
关键属性(Implus Type 为 Legacy 才有)
- 振幅 (Amplitude):原始脉冲信号的振幅,控制每次撞击的振动强度
- 旋转和方向 (Orientation and direction):脉冲可以转换信号,使振动与产生振动的冲击方向一致
- 为了产生逼真的振动,最强脉冲信号应该沿着冲击轴,并且其振幅(或强度)应该与冲击力成正比
- 在下图中,振动的主轴 (A) 与锤子撞击墙壁 (B) 时的行进方向一致:
- 注:不需要为每个可能的冲击方向和强度单独定义信号,而是使用 “局部空间” 的概念来定义原始信号
- Impulse 假定冲击的主要方向是 “向下”,因此作为一般规则,信号应该沿 Y 轴施加更多振动(6D 抖动噪音预设就是这样做的),然后可以依靠局部空间旋转和缩放来为每次撞击发生产生正确的振动
- 时间膜 (Time envelope):控制信号的起音、维持和衰减,使信号淡入和淡出到适当的强度并具有有限的持续时间
- 现实世界中的撞击产生的振动会变强,直到达到峰值强度,然后减弱,直到振动停止。这个周期需要多长时间取决于影响的强度以及所涉及的游戏对象的特性
- 空间范围 (Spatial range):控制信号在完全淡出之前在场景中传播的距离
# Fixed Signals
CinemachineFixedSignal 可以定义简单的 3D 曲线,使用三个轴的曲线进行信号自定义
- Inspector 显示每个轴的曲线预览,单击预览窗格可为该轴定义自己的曲线,如果留空则不会沿该轴移动
- 注:点击齿轮按钮可以选择将当前曲线添加到曲线预设库中
# Cinemachine Impulse Listener
主要用于使虚拟摄像机侦测到脉冲振动信号并对其做出反应
- 在现实世界中,一些相机的安装不如其他相机牢固,因此更容易晃动,可以通过 Impulse Listener 的 Gain 属性放大或衰减脉冲振动信号来模拟
另外,可通过 CinemachineImpulseChannels 可以对信号源进行过滤
# 总结
果然最好的学习方式还是跟着官方文档走一遍(前提是文档足够全面),现在 unity 的文档感觉也是详细了很多,总体还是挺顺利,多数都有详细解释,搞不清楚跟着操作一遍也能了解个七七八八
一边看,一边试验,这样走下来基本各项功能就感觉熟悉了 —— 因此决定继续,下一个就是 Timeline,然后是 DOTS 或 URP
# 参考文档
https://docs.unity3d.com/Packages/com.unity.cinemachine@2.8/manual/CinemachineUsing.html