stonstad 发表于 2023-1-20 10:05

Cinemachine 相机控制插件

解决镜头之间复杂的算法和逻辑,目标跟踪、镜头组合、镜头混合、转场等镜头
程序化镜头控制的特性:当需要对镜头作出调整时,Cinemachine会动态适应来找到最佳的镜头位置
传统方式控制相机:修改场景后,通常需要对相机进行调整

[*]Cinemachine可以用于运行时,适用各种游戏如FPS、第三人称、RPG、RTS、2D游戏
[*]vcam功能:可在场景中放置大量相机,通过组合Cinemachine中的模块来完成功能



与Timeline,Animation、Post-processing 协同使用。也可以自己创建扩展自己的相机脚本



GameObject--Cinemachine

基本流程


[*]做各种相机的不同用途,快速创建出想要的相机然后调参就可以了
虚拟相机(vcam)

[*]Cinemachine 能控制大量相机,即一个相机来实现多机位



vcam是相机的设置,控制Unity相机的变换以及设置,每个vcam是单独的,独立运行


[*]功能:决定Unity相机位置,朝向并跟踪某物体,为相机添加晃动
两个角色对话的过场动画

[*]一个vcam用于全景,两个vcam用特写镜头,使用Timeline同步音频与vcam
[*]同一时间仅一个vcam控制Unity相机,称为活动vcam
Cinemachine Brain:挂在Unity相机上的组件



跟踪场景中所有的活动vcam。通过激活/禁用vcam来指定下一个活动vcam



VCam组件移动和跟踪 Body/Aim属性:设置相机如何移动旋转



vcam跟踪两个目标。指定了相机 跟随移动/瞄准 的目标


[*]Cinemachine中包含了各种用于相机控制和瞄准的算法。可以通过继承Cinemachine组件来实现自定义的移动和瞄准的行为



Body属性算法:移动vcam


[*]③:<转换>:在屏幕空间,保持相机和跟随目标的相对位置,可设置缓动
[*]④:vcam和跟随目标使用相同位置
[*]⑤:<轨道转换>:相机和跟随目标的相对位置是可变的,接收用户的输入
[*]⑥:<跟踪滑动>:相机沿着预先设置的轨道移动
[*]⑦:相机和跟随目标的相对位置固定,可以设置缓动



Anim属性算法:旋转相机朝向LookAt的目标



镜头构图:FramingTransposer、Composer和GroupComposer


[*]Screen:Dead zone的中心区域在屏幕上的位置,可以不在正中间
Damping<阻尼>:

[*]物理相机延迟,设置了目标进入soft zone后相机的反应速度,操作相机把目标保持在dead



Noise属性:模拟摄影师手持或绑在车辆上物理相机


[*]每帧更新后,Cinemachine 给相机单独添加晃动。晃动不会影响相机后续的位置和镜头。这样保证了vcam运行结果的一致性
虚拟相机



Cinemachine中:VCam是核心的组件


[*]一般只有一个Unity相机(除了分屏),挂上Cinemachine Brain脚本,其他相机用vcam



添加vcam:添加游戏对象,挂VCam组件


body:Follow 属性
https://www.zhihu.com/video/1591956636049825792

[*]相机跟随物体移动,Follow = 物体。vcam会自动将 Unity相机和 物体保持相对位置



相机镜头对准 LookAt = Sphere



VCam的①、②、③属性,用来控制相机在移动,旋转,震动

VCam会处于下列的三种状态之一:



虚拟相机:Live活动 / Standby待命状态下,是否控制Unity相机


[*]①:当 Cinemachine Brain控制从一个vcam1混合到vcam2时,两个vcam都处于活动状态。当混合结束后,只会有一个活动vcam
[*]②:不控制Unity相机。但仍然跟随和瞄准它的目标物体,并且每帧更新。Standby 的优先级不高于活动状态的vcam



vcam3:既不控制Unity相机也不会跟随或瞄准目标,也不占用运行资源


[*]特殊情况:被禁用的相机仍然可以控制Unity相机:vcam正在参与混合或者Timeline控制



①:此vcam会直接控制Unity相机显示在Game窗口中,用于相机的调试



Follow = LookAt = Ogremagi



Cinemachine Brain根据属性从激活的vcam中选择下一个活动的vcam。Timeline上使用时这个属性不生效



Follow / LookAt:vcam会跟随 / 瞄准 这个物体移动。想相机保持自己的位置可不设置



vcam没被禁用,优先级不足时,待命时的更新方式。此属性会影响性能,设置Never是最好的


[*]③<循环更新>:所有的待命vcam循环更新,每帧更新一个相机



Lens 镜头:对应Unity相机中的属性,可从Preset中选择或创建



此属性在Unity相机中是没有的,控制镜头的旋转



Transitions 相机转换的相关设置。Blend Hint混合方式


[*]①:默认线性混合,②③:根据 LookAt 的物体球面/圆柱面 旋转混合
[*]④:在屏幕空间瞄准目标。⑤:下一个相机变成活动相机时,从上一个相机继承位置,即保持两个相机位置相同



On Camera Live事件:相机变为活动时会有对应的事件



Extension:可以给vcam添加额外的扩展

保存运行时的修改



任意VCam勾选:全局的属性,不需每个相机单独设置


[*]通过Cinemachine命名空间中的一个特殊的属性[①]



不想某些成员在运行时保存,给成员加上

Body 属性




设置相机移动时使用的算法。首先要设置Follow属性



移动算法



[*]激活时Unity相机会固定在当前vcam的位置
[*]也可通过自定义脚本来控制相机的位置


[*]在屏幕空间:将相机和跟随物体保持固定的相对位置关系。只会改变相机的位置,可设置偏移、阻尼、构图规则
[*]为2D和正交相机设计的。对于透视相机和3D环境也可以使用
算法实现

[*]首先沿着相机的 z 轴移动相机直到设定的Camera Distance 的xy平面上,然后在xy面上平移,直到目标物体在屏幕空间到达期望的位置
[*]使用Framing Transposer,LookAt = null



①:根据目标的运动,预测目标到达的位置。调整vcam与“跟随”目标的偏移量,此功能对微动的动画敏感


[*]②:预测算法的平滑度,较大的值可以消除抖动,预测但会使预测滞后
[*]③:预测计算时:会忽略沿Y轴的移动



相机尝试保持轴偏移的阻尼系数,相机反应速度。每个轴使用不同的设置可以制造出各种类型相机的行为



Screen X/Y:目标的屏幕位置。相机移动的结果是使目标处于此位置



https://www.zhihu.com/video/1591979038914060288



①:沿摄像机轴与跟随目标保持的距离,②③④:当目标在此位置范围内时,不会移动相机

Unlimited Soft Zone



Soft Zone 没有边界



①②:目标处于此范围内时,会移动相机,将目标移回到Dead Zone中



Soft Zone 的中心与目标位置的偏移



选中时,vcam激活时会将镜头中心对准物体


[*]不选中时,vcam会将目标物体放置在最近的dead zone边缘



仅当Follow属性:设置为TargetGroup时显示



Group Framing Mode:指定构图时要考虑的屏幕尺寸


[*]①/②:仅仅考虑水平/垂直尺寸
[*]③:使用水平和垂直尺寸中较大的那个来获得最佳匹配
[*]④:不进行任何构图调整



调整相机以获得所需的取景。可以是缩放、拉近拉远或同时进行


[*]①/②:仅调整 FOV / 仅移动相机
[*]③:先移动相机,然后根据需要调整FOV



目标应占据的屏幕比例:0.5 / 1 分别填充半屏和整屏



①②:朝目标拉近 /远相机的 最小大距离


[*]③④:限制相机可以接近目标的 最小/远 距离
[*]⑤⑥:自动调节FOV时的最 小/大 值
Cinemachine TargetGroup组件



多个游戏对象对作为一组,设置为 LookAt 的对象。在vcam中使用 Group Composer 算法

属性:



属性:计算 Group 的位置


[*]①:根据所有物体的包围盒计算位置
[*]②:根据所有物体的位置加权重计算



计算Target Group的旋转


[*]①:使用Target Group根物体的旋转,推荐设置
[*]②:根据所有物体的旋转加权重计算



更新Target Group的Transform的时机



①:Targets 组内包含的物体列表。②:每个对象的权重。③:每个物体的半径,用于计算包围盒。不可为负数

HardLock To Target



unity 相机保持和目标位置一致。①:相机追赶上目标位置的时间。=0 保持同步,大于 0 经过多少秒相机和目标位置重合

Orbital Transposer



支持相机和目标之间的可变相对位置关系。可以接受玩家的输入,动态控制相机



heading:代表了目标移动的方向或面朝的方向

Orbital Transposer

[*]会尝试移动相机,让镜头朝向heading的方向
[*]默认情况下,相机的位置会在target的正后面。也可以通过Bias属性设置
[*]如果给Orbital Transposer添加了输入控制器,玩家就可以控制相机围绕目标旋转。可以设置为 InputManager中的轴,也可以直接用脚本控制



①:接受不到输入:自动重新居中相机。②:用户无输入后多长时间重新自动居中


[*]③:重新自动居中的过程花费的时间



Binding Mode绑定模式:从目标推断位置时使用的坐标空间


[*]①:本地空间,相机被激活 或 target赋值时的相对位置
[*]②:…,保持相机y轴朝上,yaw和roll为0
[*]③:…,锁定到目标物体,roll为0
[*]④:…,锁定到目标物体
[*]⑤:世界空间
[*]⑥:相对于目标的位置,使用相机的本地坐标系



FollowOffset:相机偏移



①②③ 跟随目标时的位置偏移阻尼系数,相机反应速度



Pitch,Yaw, RollDamping



相机尝试保持轴旋转的阻尼系数,每个轴使用不同的设置可以制造出各种类型相机的行为



计算Follow目标的方向的方法


[*]①:基于当前帧和上一帧的目标位置之间的变化
[*]②:使用目标的刚体速度。如果目标没有Rigid body组件,会使用①
[*]③:使用目标的transform.forward 作为heading 的方向
[*]④:使用Vector3.forward 作为heading方向
Bias:相机围绕旋转的偏移,单位是度数


https://www.zhihu.com/video/1591992242717257728



通过玩家输入控制Heading方向


[*]①:Value Range的当前值。②:最大速度或者最大增加速度
[*]③:加速到最高速度所需要的时间。④:减速到0所需的时间
[*]⑤:接收输入的 Input Manager 中的轴名称,空字符串代表不接收输入
[*]⑥:玩家输入的值。可以直接通过自定义脚本控制。⑦:是否反转输入的值(取相反数)
Tracked Dolly



让相机沿预定路径移动。① 将指定将vcam放置在路径上的位置


[*]使用Auto-Dolly模式将vcam移动到路径上最接近Follow目标的位置。启用后:Auto-Dolly会自动将vcam的位置移动到最接近目标的路径上的位置
注:使用Auto-Dolly模式时,一定要谨慎选择路径形状。在围绕某个点形成弧形的路径上可能会有问题
例子

[*]一条以Follow目标为中心的完美圆形路径。路径上最接近目标的点变得不稳定,因为圆形路径上的所有点都同样接近目标。在这种情况下,将Follow目标移动很小的距离会导致相机在轨道上移动很大的距离



相机移动的路径。须引用Cinemachine Path或Cinemachine Smooth Path对象


[*]②:沿路径放置相机的位置。直接给这个属性作动画或启用Auto-Dolly。这个值以Position Units指定的单位为单位



Position Units路径位置的度量单位


[*]①:沿路径使用路径点。0 1 分别表示路径上的第一,二 个路径点
[*]②:沿路径使用距离。根据路径的Resolution 属性对路径进行采样。Cinemachine 创建一个距离查找表,并将其存储在内部缓存中
[*]③:使用路径的开头和结尾。值0,1分别表示路径的起点和终点



①:相机相对于路径的位置,此属性可使相机偏离路径本身


[*]②③④:相机如何在垂直/向上/平行 于路径的方向上保持其位置,每个轴使用不同的设置可以产生多种相机表现



为 vcam 设置向上的方向。这会影响屏幕的组成,因为相机的Aim算法会尝试遵循向上方向


[*]①:不修改vcam的向上方向,而是使用Cinemachine Brain中的World Up Override属性
[*]②:在当前点使用路径的向上方向
[*]③:在当前点使用路径的向上方向,但Roll设置为零
[*]④:使用Follow目标的向上向量
[*]⑤:使用Follow目标的变换中的向上向量,但Roll为零



相机如何跟踪目标旋转角度,影响相机反应速度



控制自动轨道位置选择方式。要使用此功能,必须设置Follow目标


[*]①:选中以启用。这可能会影响性能,具体取决于search resolution
[*]②:以position units为单位从路径上的最近点到跟随目标的偏移量
[*]③:当前段两侧的段数。如果只有一个路径使用0。当路径相对于目标位置的形状导致路径上最近的点变得不稳定时,请使用较小的数字
[*]④:Cinemachine 通过将片段分成许多直片段来搜索片段。数字越高,结果越准确。但是,对于更大的数字,性能成比例地变慢
Transposer



使用固定的相对位置将vcam跟随目标

Binding Mode:从目标推断位置时使用的坐标空间

[*]①:本地空间,相机被激活或target赋值时的相对位置
[*]②:…,保持相机y轴朝上,yaw和roll为0
[*]③:…,锁定到目标物体,roll为0
[*]④:…,锁定到目标物体
[*]⑤:世界空间
[*]⑥:相对于目标的位置,使用相机的本地坐标系



跟随目标时的位置偏移。①②③:相机尝试保持轴偏移的阻尼系数,影响相机的反应速度



相机尝试保持轴旋转的阻尼系数,影响相机的反应速度

使用DollyPath(滑轨路径)



vcam中使用Tracked Dolly算法来使用Dolly Path


[*]场景中的路径点数组。使用移动路径可以指定vcam 在固定的路径上移动
Dolly path有两个组件
1.Cinemachine Path组件

[*]每个路径点都可以设置位置、切线和翻转角度。可以最大程度控制路径,如果法线设置的不合理,相机在路径上运动时可能会有不稳定的现象
2.Cinemachine Smooth Path组件

[*]每个路径点都可以设置位置和翻转角度。使用Bezier算法来推算路径点之间的位置,虽然SmoothPath不能完全控制路径,但是整个路径会更平滑和连续。推荐类型
创建Dolly path



一:创建一个空物体,给空物体添加CinemachinePath / SmoothPath组件

二:直接创建Dolly Camera

[*]Cinemachine>Create Dolly Camera with Track。这个Path默认是Smooth Path
编辑路径点



场景中路径点上会有移动工具,可以用来可视化移动。此外还可以在Inspector上直接修改数值

Cinemachine Path组件

[*]世界空间中,定义了一系列的路径点,每个路径点都有位置、切线和翻滚角度。在路径点之间使用贝塞尔曲线插值
[*]注:尽管路径位置始终是平滑连续的,当设置的切线没有保证一,二阶导数的连续性时,就会发生动画不稳定情况,手动做到并不容易
[*]为避免这种不稳定现象,尽量用 Smooth Path



Resolution:每个路径点之间采样的次数,Cinemachine在计算路径距离时使用此值来限制粒度



路径在场景中显示的外观。只在编辑器中生效



①:分别为选中/没选中路径时的颜色②:路径轨道的宽度



①:路径首尾相连 ②:路径长度,这个数据是只读的



Cinemachine Path 组件下

Waypoints 定义路径点的列表

[*]①:在路径局部空间中的位置
[*]②:定义了路径点上曲线的切线。切线的长度代表了贝塞尔的强度
[*]③:朝向的其他轴方向是从切线和世界的向上向量推断出来的


https://www.zhihu.com/video/1592622535459151872
Smooth Path组件

[*]该组件保证了一阶和二阶连续性,意味着沿路径动画的对象<位置,角速度>将是平滑且连续



Cinemachine Dolly Cart 组件制作路径动画


[*]Cinemachine Dolly Cart翻译过来是滑轨小车。相当于把一个物体放在小车里,然后在轨道上移动。这个组件就是把当前所附着的物体沿着 path移动
创建组件

[*]Cinemachine>Create Dolly Track With Cart,这会创建出来一个 Smooth Path 和 Dolly Cart
[*]直接给游戏对象添 Dolly Cart组件



Path路径对象 Update method 更新的方法

①:正常更新。②:与物理更新同步。③:通常用于相机的更新



Speed:移动小车的速度,基于Position Unit设置的单位


[*]Position:当前小车所处的位置。基于Position Unit设置的单位
Anim 属性




设置相机旋转时算法。需要先设置Look At属性



旋转算法:④:保持目标在镜头的中心。⑤:基于玩家的输入旋转相机。⑥:相机和目标的旋转保持同步

Composer:保持目标物体在镜头内

[*]算法:旋转相机来朝向目标物体。可添加偏移、阻尼和构图规则
[*]常见跟踪的目标有:角色的上半身或头骨、车辆、动画或程序控制的空物体



相对于跟踪目标的偏移。当注视的位置不是被跟踪对象的中心时,通过属性微调跟踪目标位置



①:根据注视目标的运动来调整偏移量②:消除抖动预测但会使预测滞后③:忽略Y轴的运动



阻尼:相机在屏幕上对目标的反应速度,以使目标保持在dead zone



Screen X/Y dead zone:中心的屏幕位置相机旋转保持目标在此处



Dead Zone :目标在这个区域时,vcam会忽略目标的移动,对于忽略较小的目标移动很有用



目标出现在屏幕的此区域中,则相机将旋转。在Horizontal / Vertical Damping设置的时间内将其推回dead zone



soft zone中心相对于dead zone中心的偏移



vcam激活时会将镜头中心对准物体,不选时,vcam会将目标物体放置在最近的dead zone边缘

GroupComposer:多个目标在镜头内



算法:让镜头瞄准多个目标



根据注视目标的运动来调整偏移量:估计目标将在未来数秒之内到达的位置



阻尼:相机在屏幕方向上对目标的反应速度,以使目标保持在dead zone



Screen X/Y:相机旋转保持目标在此处。Bias X/Y :soft zone中心相对于dead zone中心的水平/垂直偏移



目标应占据的屏幕大小比例。0.5,1分别表示填充半/整屏



指定构图时要考虑的屏幕尺寸:仅考虑水平/垂直尺寸,使用较大的那个来获得最佳匹配



调整相机以获得所需的取景:缩放、拉近拉远或同时进行ZoomOnly:不移动相机,仅调整FOV



自动调节FOV时的最小/ 大值

POV



算法:基于玩家的输入来调节相机的旋转



属性:重置回中心的目标对象


[*]②: Follow 属性的 forward
[*]③: LookAt 属性的 forward



控制vcam目标的垂直朝向


[*]①:该轴的最大速度,以度/秒为单位
[*]②③:处于最大值时,加速/减速 到最大速度所花费的时间
[*]⑤:输入轴的值。值为0表示无输入。可直接从自定义脚本中修改这个值
[*]或者设置 ④:并由Unity Input Manager 驱动



当接收不到玩家输入时,自动在重新居中


[*]②:如果在轴上未检测到用户输入,则相机将等待几秒钟,然后再进行重新居中
[*]③:重新居中所花费的时间
[*]Same As Follow Target:这个算法会让相机和Follow Target一个方向。如果想让相机和目标保持同样的位置和朝向,可以在Body中使用Hard Lock to Target,在Aim中使用Same As Follow Target算法
Noise 属性




模拟相机的晃动


[*]Cinemachine中在带了一个 ② 的算法,可以给vcam的运动添加柏林噪声



Basic Multi Channel Perlin

设置一个Noise Profile属性:

[*]Noise Profile 是一个配置文件资产,里面有噪音的相关配置。Cinemachine中自带了几种profile配置,也可以自己创建 profile
[*]①:振幅增益。增益适用于噪声曲线中定义的幅度。0,1使用噪声配置文件中定义的幅度/噪音静音
[*]②:频率增益。应用于噪声曲线中定义的频率的因子。使用1使用噪声配置文件中定义的频率。使用较大的值可以更快地晃动相机
Noise profile

[*]定义程序化生成噪声曲线相关属性的资产
Basic Multi Channel Perlin算法

[*]使用profile来控制相机的运动。Cinemachine在计算相机的位置后会施加噪声移动。这样,相机噪声不会影响将来相机运动的计算



Cinemachine包含一些预定义的profile资产


[*]Cinemachine VCam组件的Noise Profile属性上来 ①②③④。先clone出来一个 6DShake 的Profile



选中Noise Profile后,Inspector中可以直观地显示噪声曲线。轴位置和旋转的属性。每个轴可以具有多个层

创建逼真的程序化噪声

[*]谨慎选择频率和幅度,以确保产生的噪声质量,这种噪声不会重复出现
[*]相机晃动会使用 Rotation噪点,因为这正是相机瞄准的地方。手持式摄像机操作员会制造出更多的旋转晃动
[*]一般先添加旋转噪声,再添加位置噪声。令人信服的噪声曲线通常将低频,中频和高频混合在一起
创建新的noise profile时从每个轴的这三层噪声开始

[*]②:较大的值相机晃动越明显。对于远景,使用较小的振幅值,因为较窄的FOV会放大效果
[*]①:典型的低范围为0.1-0.5Hz,中范围为0.8-1.5,高范围为3-4。最高可用频率取决于游戏的帧频。游戏通常以30或60Hz运行。高于游戏帧速率的噪声频率可能会出现采样出现跳跃的情况
[*]例如,如果游戏以60帧/秒的速度运行,并且将噪声频率设置为100,则相机会发出断断续续的噪声。这是因为你的游戏无法渲染比噪声帧速率更快的运动



①图形预览的时长,② 噪声曲线图的垂直高度。③噪声曲线会水平移动。仅用于可视化预览



所有轴的所有位置噪波图层



每个轴都可以设置多层的噪波。每个轴有一个图形展示


[*]①:频率噪声层中的频率,以Hz为单位
[*]②:振幅噪声层中波的振幅(高度),以距离为单位
Non-random:

[*]选中时不给波形添加柏林噪声。Cinemachine使用正弦波。取消选中可将Perlin噪声应用于该层,从而使频率和振幅随机化,同时保持在所选值的附近



所有轴的所有旋转噪波图层



每个轴都可以设置多层的噪波。每个轴有一个图形展示

虚拟相机扩展

Cinemachine的vcam可以添加很多扩展,通过扩展来获得更强的能力

[*]Collider 扩展可以让相机被其他物体遮挡时,自动避开遮挡的物体
[*]Cinemachine 内置了几种扩展,也可以通过继承 Cinemachine Extension 类来实现自己的扩展
给vcam添加扩展:可以直接把扩展脚本拖到 vcam 物体上



Cinemachine VCam 脚本中的下拉菜单中选择:内置的几个扩展



添加偏移:①相机自身空间坐标系下的偏移 ②在什么阶段来计算增加偏移


[*]③:保持镜头构图。如果在Aim 阶段之后调整相机偏移,调整偏移后重新调整瞄准的方向来保持 LookAt 的目标在屏幕中的位置



Cinemachine Collider组件。作用:保持 LookAt 目标的视线不受遮挡


[*]默认情况下:此功能是使用射线检测实现的,所以遮挡物上需要有Collider才行。此功能有点耗性能



①遮挡检测 ② 遮挡检测的层 ③ 检测忽略的Tag


[*]④:透明层,代表不会遮挡视线的层 layer
[*]⑤:如果遮挡物和目标物体很近,小于此值,就忽略这个遮挡物<不避开它>



①:避开遮挡物的功能


[*]②:目标物与相机的检测距离限制。在这个距离限制内才会检测遮挡。设置为0即代表不限制
[*]③:遮挡超过这个时长以后才调整相机避开遮挡物
[*]④:vcam会尽量与遮挡物保持不低于这个距离。如果你看到由于较大的FOV导致相机穿透了遮挡物内部,可以适当增加这个值



避开遮挡物的策略


[*]①:将相机沿着自身的Z轴往前拉,直到在遮挡物前面
[*]②:保持相机的高度,同时把相机往前拉
[*]③:保持相对于目标物体的距离,同时把相机往前拉



①:最多处理多少个遮挡物。数字越大越影响性能,一般4足够了


[*]②:平滑时长。到避开遮挡位置至少会停留这么长时间
[*]③:不遮挡时相机回到正常位置的时长
[*]④:相机从正常位置移到避开遮挡位置的时长
Shot Evaluation

[*]Optimal Target Distance:如果设置大于0的值,在计算相机位置时会更倾向于接近这个距离
Cinemachine Confiner



将相机的最终位置限定在一个区域内。Confier可以在2D或3D模式下运行


[*]在2D,3D模式下,是一个 平面/空间 的范围,不必/需要考虑深度;
[*]对于正交相机,还有一个附加选项可以限制屏幕边缘,而不仅仅是相机的位置。这样可以确保整个屏幕区域都位于边界区域内
Confine Mode:限制模式是2D还是3D



需要一个Collider2D或者Collider对象来限定范围

Cinemachine Follow Zoom



调整相机的FOV来保持物体在屏幕上的尺寸

Cinemachine Story board



①:不显示所有Cinemachine Story board的图片。②:在屏幕上显示一张图片



Aspect=BestFit:在屏幕范围内尽可能大



①:在屏幕范围内尽可能大。②:图片撑满整个屏幕,可能会有一部分不在屏幕内。③:拉伸图片撑满全屏



①:图片透明度。②:图片中心的位置。③:旋转。④:缩放比例。④:缩放比例


[*]Mute Camera:这个vcam不会控制Unity相机(相当于只使用StoryBoard的功能)
[*]Split View:图片水平方向上的分割调节
[*]Waveform Monitor:可以用来查看图片的色阶
Cinemachine Impulse Listener



用来“听到”震动信号并对震动作出反应的



脚是震动源。当脚与地板(A)发生碰撞时会产生震动。vcam上的Impulse Listener扩展会对震动作出反应,那就是相机的晃动(B),会导致Game窗口中C的结果

属性详解



①:通道遮罩。②:脉冲的增益。1正常强度,0忽略这个信号。③:使用2D距离,忽略Z轴


[*]④:真实世界中,有的相机绑定在类似树枝上,会造成晃动的更厉害。这个值越大,晃动就会越多
[*]PostProcessing Extension扩展:可以将 PostprocessingV2 的 profile 添加到 vcam 上。这个扩展在 vcam 激活时,会将 Post-ProcessingProfile 应用到相机上。如果相机和其他相机发生混合,PostProcessing 中的参数也会发生混合
在开始之前,你需要做一些设置:



①:通过 PackageManager 安装 PostProcessing



②:扩展下拉列表里看到 Cinemachine PostProcessing



③:给 Unity 相机添加 Post-ProcessLayer组件



④:给 vcam的Cinemachine PostProcessing 扩展设置 Postprocessing Profile

属性

[*]Profile:用来设置 Post-Processingprofile FocusTracksTarget 勾选时,将对焦的距离设置为相机和 LookAt目标之间的位置
[*]Offset偏移
[*]选中 Focus Tracks Target 时,对焦位置距离 LookAt 目标的距离。如果没有设置 LookAt 目标,这个偏移会是与相机的距离
Cinemachine Brain组件



组件监控场景中所有激活的vcam,控制Unity相机的vcam,也控制vcam之间的切换或者混合

提示

[*]如果在 Timeline 中使用 vcam,Timeline 会替代 Cinemachine Brain 组件做决策选择哪个相机,但是 Unity相机上还是要有Cinemachine Brain组件
Cinemachine Brain组件中有几个关键的属性:

[*]Blend Settings:定义如何从一个 vcam 混合到另一个 vcam 的列表
[*]例如,将一个条目添加到列表中,以进行从 vcam1 到 vcam2 的 4 秒钟混合,然后添加另一个条目,进行 1 秒的混合,从vcam2回到 vcam1。如果未定义两个相机之间的混合,则 Cinemachine Brain将使用其默认混合设置。
[*]LayerFilter:Cinemachine Brain 仅使用那些通过Unity相机的 Culling Mask 的vcam。可以使用CullingMask过滤图层来设置分屏
[*]Event Dispatching:Cinemachine Brain在更改镜头时会触发事件。当虚拟摄像机激活时,它将触发一个事件。从一个vcam 切换到另一个vcam 时,还会触发一个事件。后一个事件可以用来重置一些后处理效果
属性详解



ShowDebug Text:在Game窗口左上角显示当前激活的相机信息以及混合信息



①:在Game窗口左上角显示当前激活的相机信息以及混合信息。②:在Scene中显示相机的平截头体形状


[*]③:是否忽略Time scale 。④:世界坐标系中Y轴的方向。如果不设置默认就是世界坐标系中的 Y 轴向上的方向如果是一个俯视的游戏,可以覆盖默认的设置。⑤:Update Method:相机更新的时机
[*]⑧:设置虚拟相机之间是如何混合的。点击 CreateAsset 按钮来创建一个自定义混合的资产。创建好资产后,就可以在界面上通过加号+ 按钮来添加混合设置
[*]⑨:没混合时,相机激活会触发这个事件。⑩:相机之间有混合,混合开始的第一帧触发这个事件。在vcam之间混合
使用用流程



Main Camera Blends



①:从哪个相机开始混合。②:混合到哪个相机。*ANYCAMERA**来设置从指定相机混合到任意相机

③Style混合的曲线:Time混合的时长,单位是秒
vcam的管理和分组

[*]一个Cinemachine 中的相机管理器可以管理很多相机,但是还可以有vcam的功能。相机管理器也是一个vcam,所以他们支持嵌套。通过嵌套,可以创建出来非常复杂的相机组合



创建方法 gameObject-Cinemachine--

Cinemachine 中包括这些相机管理器:



FreeLook Camera:一个增强的Orbital Transposer虚拟相机。FreeLookCamera可以支持围绕角色旋转



Mixing Camera:支持最多8个子相机根据他们的权重进行混合



Blend ListCamera:支持子虚拟相机按顺序切换



Clear Shot Camera:从子虚拟相机中选择最佳视角的相机



State-DrivenCamera:根据animationstate来选择子虚拟相机



FreeLook相机:可以围绕三个位置(Rig)进行环绕,分别是Top、Middle和Bottom


[*]每个位置都有一个围绕着目标的圆环,还有自己的半径、高度偏移、Body、Anim、Noise属性设置这些和通用的vcam设置是一样的



Spline属性来连接这三个Rig。Spline决定相机在三个Rig之间混合时的位置



FreeLook Camera:使用玩家输入的x和y轴的值。x 轴:控制水平方向上的环绕。y轴:控制在3个Rig之间的混合



①:连接3个rig的曲线,决定了y轴上的位置②:相对于Follow目标的高度 ③:半径

Cinemachine Mixing Camera



可以根据权重混合子虚拟相机,最终计算出来Unity相机的位置和其他属性


[*]这个组件设计的目的是给Timeline使用,通过权重控制相机动画。Timeline 无法修改子物体的层次结构
[*]最多可以有8个子相机。子相机不能在运行时动态修改(增加/删除)。默认:会给MixingCamera添加两个虚拟相机子物体,最多再添加6个子虚拟相机
Cinemachine BlendList Camera



子相机中执行混合或切换序。①:混合的方式以及时长。②:相机保持的时长


[*]Cinemachine Blend List Camera激活时,首先会激活它的第一个子相机,等待保持(hold)一定时间后,切换到下一个子相机
[*]不循环的Blend List Camera 保持最后一个相机的状态,直到Cinemachine Brain或者Timeline禁用Blend Listcamera
[*]如果是非常简单的相机序列,这个组件比使用Timeline会简单很多
Cinemachine Clear Shot Camera



在所有子相机中选择目标的最佳视角相机。可以对目标预设多个机位,以便保证一个最佳视角


[*]这是一个非常强大的工具。这个扩展会给每个子相机添加一个Collider扩展。vcam的Collider扩展可以分析视线的遮挡、最佳距离等等。然后Clear Shot Camera 使用这些信息来选择一个最佳子相机
属性详解

[*]①:切换到下一个子相机前等待多长时间(可以避免短时间内的快速切换造成的闪屏)
[*]②:切换到下一个子相机前,当前子相机最少要保持的时长
[*]③:如果多个子相机计算出来的得分一致,那么随机一个子相机。不勾选时会按优先级选择
[*]④/⑤:子相机之间的混合方式V Cam Children列表:可以设置各个子相机的优先级。如果相机的视角得分相同时,会优先选择优先级高的
CinemachineState-DrivenCamera



根据动画的状态来激活子相机:角色的相机在跑步的时候可以有更多的晃动,在走路的时候可以更平滑


[*]每个子相机可以单独设置 LookAt 和 Follow 对象。如果没有设置,会自动使用State-DrivenCamera上设置的LookAt和Follow对象



根据Animator中的状态来设置对应的机位使用 State-Driven camera 的流程如下



根据 Animator 中的状态来设置对应的机位


[*]菜单栏Cinemachine>CreateState-DrivenCamera创建相机
[*]设置好Animator组件中的 AC



3:中的Animator赋给State-DrivenCamera的AnimatedTarget属性



4:在State-Driven camera下创建多个子相机



State列表中设置State和子相机的映射关系



①:需要一个Animator对象来控制动画状态。②:使用AC的层


[*]③:相机之间的混合方式State列表设置Animator
[*]④:Controller中的状态和Camera之间的映射关系
[*]⑤:切换到下一个子相机前等待多长时间(可以避免短时间内的快速切换造成的闪屏)
[*]⑥:切换到下一个子相机前,当前子相机最少要保持的时长(可以避免短时间内的快速切换造成的闪屏)
Cinemachine Impulse 相机震动

[*]可以根据游戏事件产生和管理相机晃动。比如当两个物体发生碰撞、附近发生爆炸时,可以让vcam发生剧烈晃动
Impulse由三个部分组成

[*]Raw vibration signal<原始震动信号>。包含6个维度:x,y,z,pitch,roll,yaw的震动曲线。这个震动信号很大程度上决定了相机镜头晃动的表现形式
[*]Impulse Source 震动的发生源:定义了震动发生的位置、时长、强度和范围
[*]Impulse Listener Cinemachine的扩展:添加了这个扩展后vcam就能“感受到”震动,并且作出晃动的反应
Impulse 使用流程



1:给场景中物体添加 Impulse Source(代码触发)或 Collision ImpulseSource(碰撞触发)组件,这些物体会作为震动源



2:设置震动信号RawSignal,可以使用内置的Presets,也可以自定义创建



3:给需要对震动作出反应的虚拟相机添加 Cinemachine Impulse Listener组件

震动源组件
Impulse Source和 Collision Impulse Source组件都是震动源组件区别

[*]Collision Impulse Source:根据碰撞或触发器产生震动信号
[*]Impulse Source:根据事件产生震动信号
震动源:

[*]可以根据代码或碰撞触发震动源产生震动信号。触发震动源后,震动源产生震动信号,然后拥有Impulse Listener 扩展的vcam对震动做出反应产生晃动



脚是震动源。当脚与地板 A ,发生碰撞时会产生震动。vcam上的Impulse Listener扩展会对震动作出反应,那就是相机的晃动 B,会导致Game窗口中C的结果

Impulse Source的核心属性



原始震动信号 定义了相机晃动的基本“形态”,Impulse Source组件中控制了一些其他重要的属性,影响生成的震动

主要属性:

[*]Amplitude: 控制震动的振幅
[*]Orientation and direction :朝向和方向。震动可以改变信号的方向,保持震动方向的一致
[*]Time envelope: 控制信号的起音,维持和衰减,以使信号淡入和淡出至适当的强度并具有一定的
[*]持续时间。
[*]Spatial range :空间范围控制信号在场景中完全消失之前在场景中传播的距离
Amplitude 振幅



Raw Signal属性:振幅控制每次震动的强度。有两种方法可以调整给定震动信号的振幅


[*]Amplitude Gain:可以放大或衰减原始震动信号,它会一直影响所有震动。可以将其视为用于调高或调低源震动强度的全局“音量”设置
[*]代码生成信号时更改Velocity矢量的大小也会缩放信号振幅。但影响是单次的,不是全局的。通过 调整单个震动事件的Velocity,可以让轻度冲击产生较小的振动,而重度冲击产生较大的振动
对于Cinemachine Impulse Source组件



必须自己通过脚本设置Velocity。信号的幅度按速 度的大小缩放

代码如下:
var source = GetComponent<CinemachineImpulseSource>();
source.GenerateImpulse(new Vector3(100, 100, 100));

[*]对于Cinemachine Collision Impulse Source组件自动根据三个属性定义的规则来计算单次的 Velocity:Use Impact Direction、Scale Impact With Mass、Scale Impact With Speed。
[*]最终每次碰撞的实际振幅,就是全局参数(信号源,Amplitude Gain属性)和单次调节参数Velocity相乘的结果
Orientation and Direction 朝向和方向

[*]为了产生逼真的振动,震动信号沿冲击轴应最强,其振幅(或强度)应与冲击力成正比。例如,如果你用锤子敲击墙壁,则墙壁主要沿锤子路径的轴线振动。为了使锤子的脉冲信号更真实,它在该轴上应具有最大的振动。



振动主轴(A)与锤子撞击墙壁(B)时的行进方向一致


[*]Impulse 不需要为每个可能的冲击方向和强度分别定义信号,而是使用“局部空间”的概念来定义原始信号。你可以在原始信号的本地空间中旋转和缩放原始信号,以生成与实际影响相匹配的“最终”信号
[*]Impulse 默认情况下撞击的方向是“向下”,因此,一般你的信号应沿Y轴施加更多的振动(6D shake noise profile会这样做)。你也可以通过局部空间的旋转和缩放来为每次撞击产生正确的振动方向
控制朝向和方向

[*]Impulse Source和Collision Impulse Source组件中的属性可以控制原始信号的朝向。使用下面这些属性来模拟现实世界的振动
对于Impulse Source组件

[*]GenerateImpulse( ) 方法将速度矢量作为参数。该 矢量定义了冲击的方向和强度。Impulse系统使用它根据原始信号定义来计算最终信号,并对其进 行适当的旋转和缩放。
对于Collision Impulse Source组件

[*]会根据所涉及GameObject的方向和质量 自动生成速度矢量。要控制生成结果,使用 Inspector中的How To Generate The Impulse中的 属性。Use Impact Direction属性控制信号是否被旋转到对应冲击方向



Use Impact Direction属性:控制信号是否被旋转到对应冲击方向



方向模式属性可以对信号方向进行微调

设置为Rotate Towards Source 时

[*]脉冲信号会进一步旋转,以使振动指向震动源的方向更加明显。 对于径向对称振动,效果并不明显,但是对于强调方向的信号(如6D震动),它可以暗示振动的来源。 当你在多个位置产生影响并且不希望它们都感觉相同时,这可能会非常有效
[*]Direction Mode = Fixed,不会产生特殊效果



Time envelope 时间包络


[*]真实世界中,冲击产生的振动会先增强,直到达到峰值强度,然后减弱直到振动停止。这个周期需要 多长时间取决于撞击的强度以及所涉及物体的特征
当场景中的碰撞晃动相机时,使用Impulse Source中的Time Envelope属性控制此循环。Time Envelope具有三个属性:

[*]①:控制脉冲信号向峰值强度的过渡。②:指定信号在峰值强度处停留多长时间。持续时间仅仅是一个持续时间值 。③:控制信号从峰值强度到零的过渡。①和③中包含时长值(指定过渡持续多长时间)和一个曲线(可选,定义它如何发生,例 如,是否逐渐地或突然发生)。如果在Inspector中将曲线留为空白,则Impulse将使用默认曲线,适用 于大多数用途
总而言之

[*]这些属性控制着撞击产生的振动持续多长时间,以及它们如何淡入和淡出。但是,它们并不 能改变震动强度。可以启用 ④ 属性。启用后,时间范围会根据影响的强度进行缩放。 较强的影响会使持续时间更长,而较弱的影响会使持续时间更短。这不会影响三个阶段的时长比例
Spatial Range 空间范围



定义了场景中震动源影响的区域,此区域中的 Impulse Listener 会对脉冲源做出反应(除非将它们过滤掉),而位于外部的Listener 则不会作出反应

该区域包括两个属性:①冲击半径。③耗散距离

[*]当脉冲源产生脉冲时,振动信号将保持全强度,直到到达冲击半径的末端。然后,其强度在耗散距离上衰减为零。这两个属性共同定义了信号的总范围
下图中,从振动点发出到到达冲击半径 A为止,振动信号一直保持全强度,然后在耗散距离B 处逐渐消失



Dissipation Mode耗散模式属性:控制信号在Dissipation Distance耗散距离上如何淡出





① Linear Decay线性衰减:会在耗散距离上产生均匀的淡出

②软衰减:创建的淡出开始缓慢,加快并在接近耗散距离终点时再次减速。③指数衰减:会产生逐渐消失的衰减,随着逐渐接近耗散距离的末尾,衰减会变 慢
Cinemachine Collision Impulse Source组件

[*]基于碰撞的震动,可以给有碰撞器的物体添加 Collision Impulse Source组件。当其他物体 和这个碰撞器发生碰撞时,或者进入触发器的区域时,会产生一个震动。 需要注意的是一定要保证两个物体发生碰撞时,Collision Impulse Source组件所在的物体能接收到On Collision Enter或On Trigger Enter事件
[*]关于两个碰撞体能否产生碰撞事件的表格:https://docs.unity3d.com/Manual/CollidersOverview.html



默认下,震动源影响范围内的所有 Impulse Listener,但是可以设置channel filtering来筛选。Edit按钮可以新建或者编辑通道资产

Impulse Channel 震动通道

[*]Impulse Listener 可以根据震动通道筛选它们感兴趣(会做出反应)的震动。Channel 有点像 Camera的 layer,但是这的 channel 是独立的。设置通道后,这个震动源发出的震动只会广播给设置的通道
Signal Shape :



控制原始振动信号的一些特性

Raw Signal 原始信号



①:使用内置的信号设置,或者自定义Noise Setting或者Fixed Signal,又或将工程中设置好的Noise资产直接拖到这


[*]②振幅增益:设置一个值,将原始信号的幅度乘以该值。这控制了振动的强度。默认情 况下设置为1。使用大于1的值来放大信号,使用1表示原始信号,使用0<A<1 的值来衰减信号, 使用0来使信号静音
[*]③频率增益:设置一个值,以该值乘以原始信号的频率。这控制了振动的速度。默认情 况下设置为1。使用大于1的值增加频率,使用1表示原始信号,使用0<F<1的值减小信号的频率。频率0无限期保持单个噪声值,就像冻结时间一样。
Randomize:

[*]启用此选项可以随机分配原始信号的开始时间。当原始信号是噪声配置文件资产时,此属性可用Repeat Mode:
指定是在Time Envelope的持续时间内循环原始信号,还是将其拉伸以适合Time Envelope。当原始信号是固定信号时,此属性可用



这些属性控制脉冲的持续时间和该持续时间内原始信号的强度


[*]①:定义信号经过多久达到全振幅。使用数字字段设置达到完整振幅的时间(以秒为单位)。预览窗格留空会使用默认曲线
[*]②:设置达到全振幅后持续的事件
[*]③:定义信号如何从全振幅变为零。使用数字字段设置信号静音的时长(以秒为单位)。预览窗格留空会使用默认曲线
[*]④: 信号振幅整体时长会根据碰撞强度来进行缩放。较强/轻微的碰撞持续的时间更长/较短
Spatial Range



定义一个空间范围,Impulse Source会影响这个范围内的Listener


[*]①冲击半径: 设置场景中信号保持全振幅的冲击点周围的空间的半径。除此之外,信号强度在耗散距离上逐渐消失。之后,强度为零。换句话说,信号的总作用半径为“ 冲击半径 + 耗散距离”。
Direction Mode方向模式



当Impulse Listener移动远离脉冲源时,Collision Impulse Source组件应如何设置信号方向


[*]①: 使用固定的信号方向。
[*]②:使用Rotate Toward Source可沿脉冲源的方向旋转信号,从 而提供有关信号源位置的线索。Rotate Toward Source不影响径向对称信号



控制信号在Dissipation Distance耗散距离上如何淡出


[*]③指数衰减:会产生逐渐消失的衰减,随着逐渐接近耗散距离的末尾,衰减会变慢
[*]②软衰减:创建的淡出开始缓慢,加快并在接近耗散距离终点时再次减速
[*]①线性衰减:会在耗散距离上产生均匀的淡出



Dissipation Distance耗散距离: 设置信号超出冲击半径耗散到0的距离

Trigger Object Filter



筛选碰撞


[*]Layer Mask中设置的layer会触发震动,此外还可以设置Ignore Tag来 忽略特定的Tag。Layer可以多选,Tag只能设置一个
How To Generate The Impulse



如何生成震动


[*]当一个物体以一定速度碰撞到 Impulse Source 时会在碰撞位置触发震动。Unity可以根据碰撞物的质量、速度来动态调整碰撞的强度
[*]①使用冲击方向: 启用此设置可旋转脉冲信号,使其与冲击速度的方向相对应。例 如,如果原始信号垂直振动,而冲击方向是水平方向,则可以勾选此属性以使最终的脉冲信号水平振 动。不勾选时,不管冲击方向如何,均使用原始信号的方向。
[*]②根据质量调整冲击强度 :启用此设置可根据碰撞的GameObject的质量增加或 减少脉冲信号的幅度。质量在碰撞Rigidbody或RigidBody2D组件中指定
[*]③根据速度调整冲击强度 :启用此设置可根据碰撞速度缩放信号幅度。移动速 度更快的GameObject具有更大的动量,因此会产生更强的信号。禁用此设置可忽略碰撞的 GameObject的速度
Cinemachine Impulse Source组件

[*]这个组件可以根据事件来触发震动,用于没有碰撞或者触发器的时候。这是一个通用的Impulse Source 生成器,暴露了一系列 GenerateImpulse( ) 方法,可以通过继承它来实现自己的震动。这些方法在 特定的位置生成特定速度、强度的震动。你可以直接在脚本中调用这些方法,也可以使用UnityEvent
小提示:如果要创建自己的震动生成器,可以阅读这个脚本源码作为参考。 默认情况下,震动源影响范围内的所有Impulse Listener,但是你可以设置channel filtering来筛选。 使用这个组件时,需要手动调用来产生震动信号,调用方法如下:
using Cinemachine;
using UnityEngine;
public class ImpulseGenerator : MonoBehaviour
{
void Start()
{
var source = GetComponent<CinemachineImpulseSource>();
source.GenerateImpulse();
}
}



从下拉框中可以选择一个或多个通道,点击右边的Edit按钮可以新建或者编辑通道资产


[*]Impulse Channel 震动通道:Impulse Listener可以根据震动通道筛选它们感兴趣(会做出反应)的震动。Channel有点像Camera的 layer,但是这的channel是独立的。设置通道后,这个震动源发出的震动只会广播给设置的通道
Signal Shape



控制原始振动信号的一些特性


[*]Raw Signal 原始信号。可以使用内置的一些信号设置,也可以自定义Noise Setting或者Fixed Signal。也可以将工程中设置好的Noise资产直接拖到这



Raw Vibration Signals 原始振动信号

创建自定义信号

[*]可以创建自己的信号,只需要继承 SignalSourceAsset类 即可,创建后会自动出现在菜单中
using Cinemachine;
using UnityEngine;
public class MyCustomSignal : SignalSourceAsset
{
public override void GetSignal(float timeSinceSignalStart, out Vector3 pos,
out Quaternion rot)
{
throw new System.NotImplementedException();
}
public override float SignalDuration
   {
      get;
   }
}
Noise Profile

[*]是定义程序化生成噪声曲线相关属性的资产。Basic Multi Channel Perlin算法 使用这个 profile来控制相机的运动。Cinemachine在计算相机的位置后会施加噪声移动。这样,相机噪声不会影 响将来相机运动的计算
[*]Cinemachine 包含一些预定义的profile资产



在 Cinemachine VCam组件的 Noise Profile 属性上来修改、克隆、定位位置、新建

创建或修改Noise Profile

[*]我先 clone 出来一个6D Shake的Profile。 选中这个 Noise Profile 后,Inspector中可以直观地显示噪声曲线。x,y 和 z轴有位置和旋转的属性。每个轴可以具有多个层
Fixed SIgnals

[*]Cinemachine Fixed Signal 资产是一个简单的3D曲线,你可以自己配置。Cinemachine Impulse会把曲线拉伸或者循环来匹配整个振动的周期(attack-sustain-decay)
[*]FixedSignal是工程中的资产,你可以直接从Project窗口中拖到 Raw Signal属性上
创建一个新的Fixed Signal

[*] 在Impulse Source Inspector上,点击 Raw Signal属性右边 齿轮小图标,选择 New Fixed Signal
[*] 弹出对话框中选择一个位置,设置资产名称并保存
[*] 在Project中选中刚创建的资产,Inspector上会显示XYZ curve属性



点击每个Curve后面的框可以编辑曲线。和Animation Cure编辑一致

Filtering impulses震动筛选
震动的筛选器可以让你设置Impulse Source何时、如何产生震动。有两种筛选的方式:

[*]使用channel筛选
[*]在Collision Impulse Sources中使用碰撞物体筛选
当 Impulse Listener被设置为只监听特定频道时,它仅对在这些频道上广播的Impulse Source做出反应
添加频道

[*]频道数据保存在Cinema chineImpulse Channels脚本中。默认情况下,它里面只有一个频道,你可以 根据需要添加任意数量的新频道,最多31个
要添加新频道:
1. 选中Cinemachine Impulse Channels脚本,有两种方式:

[*]在Cinemachine Impulse Listener组件的Inspector中,Channel Mask属性的下拉菜单,然 后单击旁边的Edit按钮
[*]在“Impulse Source”或“ Collision Impulse Source”组件的 Inspector中,Impulse Channel属性的下拉菜单,然后单击其旁边的Edit按钮
2. 展开Impulse Channels属性组,然后将 Size 属性设置为所需的频道数。每个频道都会出现一个新条目
3. 重命名新频道



添加频道后,可以从Inspector中的频道下拉列表中立即使用频道

设置收听/广播频道

[*]设置频道后,你需要定义Impulse Listener和Impulse Source如何使用它们



检查每个Impulse Listener,然后从Channel Mask下拉列表中选择要监听的频道。



以从下拉列表中选择多个频道。你也可以选择Everything使用所有频道,或者None不选中任何频道。

使用Layer和Tag过滤



使用Layer和Tag过滤


[*]还可以使用Unity的Layer和Tag来指定哪些游戏对象与Collision Impulse Source碰撞或进入触发区域时触发震动,这称为Trigger Object Filtering触发对象过滤
Collision Impulse Source组件的Trigger Object Filter中有两个属性:

[*]Layer Mask下拉列表中包含所有的Layer。当你选择一个或多个层时,这些层中的游戏对象与 Impulse Source碰撞时会触发震动。Impulse Source忽略与其他层上的GameObjects的碰撞
[*]Ignore Tag下拉列表中包含所有的标签。当你选择一个标签时,带有该标签的游戏对象与Impulse Source碰撞时不会触发震动,即使它们位于Layer mask属性的层中也不会触发震动
例如,在一个大型动物在森林中闲逛的场景中,你可能希望相机与大树而不是小树苗发生碰撞时摇晃

[*]设置这个效果的一种方法是使动物成为 Impulse Source,将所有大树放在一个单独的Layer上,然后选择该层作为Impulse Source的“Layer Mask”
[*]如果所有树(大树和小树都一样)都在同一层上,则可以为小树分配一个特殊标签,然后使用Ignore Tag属性将其过滤掉
Timeline中使用Cinemachine


[*]Cinemachine 可以很好地和Timeline结合使用,比直接使用相机动画能创造更好的镜头。使用Timeline 可以激活、停用、混合虚拟相机。Timeline可以将Cinemachine与其他GameObject和资产组合在一 起,以可视化方式创建、调整出丰富的过场动画,甚至是交互式的过场动画。
提示:对于简单的镜头序列,可以直接使用CinemachineBrain中的Custom Blends

[*]使用Timeline时,Timeline会覆盖Cinemachine Brain基于优先级的决策。当Timeline播放完后,控制权返回到Cinemachine Brain,它会选择优先级最高的虚拟相机
[*]可以使用 Cinemachine Shot Clip在时间轴中控制虚拟相机。每个镜头片段都指向一个虚拟相机,以将其激活然后再将其禁用。使用一系列镜头片段来指定每个镜头的顺序和持续时间
要在两个虚拟相机之间切换,可以将clip相邻放置。要在两个虚拟相机之间混合,可以重叠片段


为Cinemachine创建时间轴



①创建空GameObject -② Timeline Create--③CinemachineBrain组件的Unity相机拖到Timeline编辑器。④右键AddCinemachine Track。⑥ 将其他轨道添加到Timeline以控制场景的内容

将Cinemachine Shot Clips添加到Cinemachine轨道


1.在Cinemachine Track中,右键单击并选择Add From Cinemachine Virtual Camera Base或 Add Cinemachine Shot


2. 执行以下任一操作:



要将现有的vcam添加到clip,选择 Add From Cinemachine Virtual Camera Base,这会自动将选择的虚拟相机设置到Cinemachine Shot组件的Virtual Camera属性中


[*] 要创建一个新的虚拟相机并将其添加到镜头片段中,选择Add Cinemachine Shot,在 Cinemachine Shot组件中单击Create按钮
3. 在Timeline编辑器中,调整镜头片段的顺序、持续时间、切换和混合
4. 调整虚拟相机的属性,主要是设置跟随Follow或者瞄准的Aim的对象
5. 如果要设置虚拟相机属性的动画,给它创建动画轨道,然后像其他GameObject一样录制动画即可
使用Cinemachine的一些特殊情况
使用多个Unity相机

[*]分屏和画中画效果需要多个Unity相机。每个相机展示自己的图像
[*]对于两个玩家的游戏,左右分屏效果如何制作呢
1、给每一个玩家创建一个layer。例如两个玩家,就 创建两个layer,分别为P1和P2


2、在场景中设置两个相机,设置好相机的viewport属性。每个相机添加Cinemachine Brain组件
3、每个Unity相机设置Culling Mask属性。注意玩家1的相机不包含P2层,玩家2的相机不包含P1层。
4、添加两个虚拟相机。一个相机跟随玩家1并设置layer为P1,另一个相机跟随玩家2并设置layer为 P2
Cinemachine External Camera组件

[*]该组件能将非Cinemachine相机放在Cinemachine系统中使用,从而使其可以参与混合。只需要给Unity相机添加CinemachineExternalCamera组件即可
[*]你还需要额外采取一些措施(例如,禁用Camera组件),以确保这个相机不会与Cinemachine主相机发生冲突。
不建议使用此组件,建议使用一个虚拟相机,Anim和Body都设置为Do Nothing即可达到同样的功能



属性

Cinemachine Brain会根据这个属性从所有激活的vcam中选择下一个活动的vcam。在Timeline上使用时这个 属性不生效。
Look At瞄准:Unity相机镜头瞄准的物体。Aim属性使用这个属性来更新Unity相机的旋转。如果你想
相机保持原来的角度,不要设置这个属性
Cinemachine在 2D 中的使用

[*]Cinemachine也支持正交相机。当你设置Unity相机为正交投影时,Cinemachine会自动配合。vcam中的Lens、FOV属性会被替换为Orthographic Size。需要注意,基于FOV的设置或算法例如Follow Zoom,在正交相机下没有效果
[*]在正交环境中,通常不会旋转相机。所以,Cinemachine提供了Framing Transposer算法在屏幕空间进行构图,不会选转相机
Cinemachine中的俯视视角游戏

[*]Cinemachine虚拟相机是基于真实摄影师及他们的摄影操作设计开发的。因此,vcam默认是对上/ 下轴敏感,并始终尝试避免镜头发生翻转。基于这个特性,vcam会避免长时间的垂直仰视或者服饰。可能会在镜头过程中出现,但是不会长时间的仰视或俯视。如果Look At目标在很长一段时间内一直向上或向下,相机可能不会总是给出期望的结果
提示:你可以通过设置虚拟相机的Dutch属性来故意翻转镜头

[*]如果要构建类似RTS的俯视视角游戏,最佳做法是重新定义向上方向。你可以通过将Cinemachine Brain中的World Up Override设置为一个GameObject,这个GameObject自身的up(local坐标系的y 轴方向)指向你希望的虚拟相机正常向上的方向。不过记住,修改了这个属性会影响这个Cinemachine Brain控制的所有虚拟相机
页: [1]
查看完整版本: Cinemachine 相机控制插件