创建Virtual Camera:鼠标右键(或点击上方的GameObject)-> Cinemachine -> Virtual Camera,创建完Virtual Camera后会发现场景原相机上会自动添加一个CinemachineBrain的组件
CinemachineBrain是Cinemachine中另一个核心组件(如图),可以称之为大脑。它挂载在Camera上,监控着场景中所有active状态(Live和Standby)的VirtualCamera。若一个inactive状态的VirtualCamera,其Priority值大于等于当前Live状态的VirtualCamera,当我们将其设置为active状态,那么CinemachineBrain就会选择它作为新的Live状态的VirtualCamera。我们可以使用这种方法来实现镜头的切换。
注:我们也可以使用Timeline来控制VirtualCamera,这种情况Timeline的处理逻辑会覆盖CinemachineBrain的。
下面对该组件的参数进行详细解释
Show Debug Text | 开启后会在Game视图中显示当前Live状态下的VirtualCamera的文本信息 |
Show Camera Frustum | 开启后在Scene视图中会始终显示Camera的视锥体。 |
Ignore Time Scale | 使VirtualCamera响应用户的输入和阻尼时忽视TimeScale的设置。 |
World Up Override | 用于指定VirtualCamera在世界空间中向上的向量,若为空,则为世界空间中Y轴的方向,即 (0, 1, 0)。否则使用设置的目标的Y轴的方向。使用好该设置对于避免万向节锁(gimbal-lock)非常重要 |
Update Method | VirtualCamera更新位置和旋转的方式 |
Update Method--Fixed Update | VirtualCamera的更新与物理模块同步 |
Update Method--Late Update | 在MonoBehaviour的LateUpdate中更新 |
Update Method--Smart Update | 每个VirtualCamera根据其目标的更新方式来更新,推荐使用。 注:Smart Update具体是通过UpdateTracker实现的。在一定时间内(UpdateStatus.kWindowSize = 30,即30帧内),通过调用UpdateTracker.OnUpdate(UpdateTracker.UpdateClock),可以计算出VirtualCamera的目标在fixedUpdate移动次数多还是在lateupdate移动的次数多,用来判断下一段时间用fixedUpdate还是lateUpdate。具体可以看UpdateTracker.OnUpdate方法。 |
Update Method--Manual Update | VirtualCamera不会自动更新,必须我们手动的调用ManualUpdate()来更新(应该在Camera跟随或看向的目标移动后调用) |
Blend Update Method | 主摄像机混合和更新的时机 |
Blend Update Method--Fixed Update | 仅在Update Method使用的是Fixed Update并且在混合时发现剧烈震动时使用 |
Blend Update Method--Late Update | 在MonoBehaviour的LateUpdate中出来,推荐使用 |
Default Blend | 用于设置两个VirtualCamera混合的方式,除Cut外,其它方式可在后面设置一个混合的持续时间。 |
Default Blend--Cut | 瞬切,立马显示下个VirtualCamera的画面 |
Default Blend--Ease In Out | S型曲线,混合开始和结束时比较平滑(慢->匀速->慢) |
Default Blend--Ease In | 混合结束时比较平滑(匀速->慢) |
Default Blend--Ease Out | 混合开始时比较平滑,然后匀速到结束(慢->匀速) |
Default Blend--Hard In | 混合开始时很很慢(从超级慢开始加速) |
Default Blend--Hard Out | 混合结束时很很慢(从较快速度减速到超级慢) |
Default Blend--Linear | 匀速移动 |
Default Blend--Custom | 自定义混合曲线 |
Custom Blends | 在前面的设置中,设置的是所有的VirtualCamera的混合方式,但是假如当我们的场景中有多个VirtualCamera,并且不同的VirtualCamera之间的混合方式不尽相同的时候,就需要通过该属性来设置不同VirtualCamera之间的混合方式了。会生成一个Asset用来存储数据. 需要注意的是,在From和To中设置的是VirtualCamera的名称,也就是一个字符串,而非是VirtualCamera的引用。我们可以通过设置内置的**ANY CAMERA**来代表任何一个VirtualCamera。 当要执行Blend操作时,首先会从Custom Blends中查找匹配项,若没有,则使用Default Blend的设置。若有多条匹配项,则优先选择最符合要求的。(例如vc1混合到vc2,一项是From:vc1,To:vc2,一项是From:vc1,To:ANY CAMERA,那么前面那项是更符合要求的,会被使用)若有多条最符合要求的,则选择最先找到的那一条。 |
Camera Cut Event | 当一个VirtualCamera变为Live状态,并且其混合方式为Cut的情况下触发 |
Camera Activated Event | 当一个VirtualCamera变为Live状态时触发,若带有混合,则触发在混合开始的第一帧。 |
点击创建的Virtual Camera对象,它身上有一个CinemachineVirtualCamera组件,下面对该组件的参数进行详细解释
图1
图2
Cinemachine鼓励我们多创建VirtualCamera,因为VirtualCamera只会消耗很小的性能。我们可以将除了正在使用的VirtualCamera都关闭,来达到最佳的性能。
也建议一个镜头使用一个VirtualCamera,例如两个角色对话的过场动画,我们可以使用三个VirtualCamera,一个看向两个角色中间,另外两个分别给角色特写,然后利用Timeline来同步声音和VirtualCamera。例如一开始开启着看向屏幕中间的VirtualCamera,当其中一个角色需要单独特写的时候,再开启对应的VirtualCamera,当不需要特写的时候关闭,镜头就又会回到看向屏幕中间的VirtualCamera。
FreeLook Camera是可以基于第三人称视角进行自由观察的虚拟相机。如下图所示,自由视角相机有上中下三个红圈,我们可以通过修改Cinemachine Free Look组件中的值来修改红圈的高度及大小。三个红圈由一个纵向的红线相连,该组件中其他参数与Virtual Camera一致
轨道相机即相机可以在轨道上进行移动,来实现电影或游戏CG中部分镜头效果,要想实现该效果首先要创建轨道,而Cinemachine提供了Dolly Paths来实现路径的绘制。
使用Dolly Path就可以指定出一个特定的路径来供我们的VirtualCamera,例如下图:
图中的绿色的路径就是我们的相机的移动路径,它由图中的白点连线而成。这些小白点,我们称之为waypoint。我们可以通过添加删除以及修改waypoint,来绘制我们想要的路径。
Cinemachine为我们提供了CinemachinePath和CinemachineSmoothPath两种组件用于绘制路径。
CinemachineSmoothPath组件如图
其中路径中的点即对应着组件中Waypoints数组的成员。每个waypoint包含XYZ的坐标信息,以及Roll的旋转信息。waypoint之间的连线方式使用了贝赛尔曲线的插值法(Bezier interpolation),因此我们不需要进行太多的设置,Cinemachine就会帮我们绘制好光滑且连续的路径。推荐使用。
接下来,我们来看看组件中各个属性的具体含义:
Resolution | 定义了waypoint之间路径的精确度,即被分为多少段,会影响到路径长度的计算。 |
Path Color | Scene视图中,选中路径时,显示的颜色。 |
Inactive Path Color | Scene视图中,未选中路径时,显示的颜色。 |
Width | Scene视图中,路径的宽度 |
Looped | 勾选该选项,路径会首尾相连。 |
Path Length | 路径的总长度。 |
Waypoints | waypoint的数组。 |
Waypoint.Roll | 即waypoint点围绕着z轴的旋转,默认为0,我们的路径会平行于xz平面,若旋转90度,则会垂直于xz平面。 |
CinemachinePath组件如图所示,CinemachinePath相比CinemachineSmoothPath区别主要在于,waypoint的属性中除了Position和Roll外,还多了Tangent属性。该属性主要用于调整waypoint间路径的弯曲程度,由于是我们自己调整的,因此若调整的不好,在Camera经过两段路径的接连处时,可能会出现抖动的情况。
大部分属性基本和CinemachineSmoothPath的一样,就不重复介绍了,此处只介绍不同处
Prefer Tangent Drag | 如果我们要在Scene视图中通过拖动来调整Tangent时,但是此时Tangent的坐标系和waypoint的坐标系重叠时(即Tangent的值为Vector.zero),会发现点不到Tangent的坐标系。那么此时我们打开这个开关,就可以帮助我们优先选中的是Tangent的坐标系。 |
Waypoint.Tangent | 我们可以理解为,有一个点,它到waypoint的偏移量为tangent的值。它和waypoint的连线,即该waypoint的曲线的切线,切线的长度代表着bezier handle的强度,长度越长,曲线越平滑。 |
根据前面的知识,我们已经可以绘制自己想要的路径了。那么,接下来,我们要如何让我们的Camera在路径上移动?在设置VirtualCamera的时候,我们知道,当给VirtualCamera设置了Follow目标时,Camera就可以跟随着我们设置的目标移动,而通过设置Body属性,可以设置相关的跟随方式。在Body中Cinemachine为我们提供了Tracked Dolly模式,用于实现Camera在路径上移动,具体设置如下:
Path | 即VirtualCamera要使用到的路径,也就是我们前面提到的Cinemachine Path 或 Cinemachine Smooth Path。 |
Path Position和Position Units | Position Units的值会影响到Path Position的意义,因此放在一起说: |
Position Units--Path Units | Path Position取值范围 0~waypoints.Length-1,如Path Position=1,VirtualCamera即在下标1的waypoint所在的位置。 |
Position Units--Distance | Path Position取值范围 0~Path Length,如Path Position=1,VirtualCamera即在距离起点长度为1的位置。 |
Position Units--Normalized | Path Position取值范围 0~1,如Path Position=1,VirtualCamera即在路径的终点。 |
Path Offset | VirtualCamera位置相对于Path的偏移,X的方向在Path所在平面且垂直于Path,Y的方向是Path的正上方,Z的方向在Path所在平面且与Path平行。会受到path旋转的影响,即waypoint的roll值。 |
Camera Up | 如何设置VirtualCamera.transform.up的值,VirtualCamera在Aim计算时,会尝试遵守这个值。 |
Camera Up--Default | 不修改VirtualCamera的up的值,使用Cinemachine Brain中World Up Override属性代替。 |
Camera Up--Path | 使用当前位置Path的up向量 |
Camera Up--Path No Roll | 使用当前位置Path的up向量,但是不受Roll影响 |
Camera Up--Follow Target | 使用Follow目标的tramsform.up |
Camera Up--Follow Target No Roll | 使用Follow目标的tramsform.up,但是不受Roll影响 |
Auto Dolly | 使用Auto Dolly,可以自动将VirtualCamera移动到Path上最接近Follow目标的位置。这样当我们Follow目标移动的时候,Path上的VirtualCamera会跟着移动到最接近我们目标的位置。 |
Auto Dolly--Enabled | 开启或关闭Auto Dolly功能,开启该功能对性能会造成一定的影响。 |
Auto Dolly--Position Offset | 偏移量(基于position units),Camera的最终在Path上的位置 = 最近的点 + 偏移量。 |
Auto Dolly--Search Radius | 搜索半径,我们的Path是根据waypoint一段段连接起来的,这个半径指的是,在VirtualCamera所在的当前片段,向两边延伸多少个片段,作为搜索范围。若为0,则表示整个Path都作为搜索范围。 如果当目标移动时,Path上计算出的最近点不稳定,我们可以使用较小的值来缩小范围。 |
Auto Dolly--Search Resolution | 将一个片段分成多少连续的块用于搜索。值越高结果越精确,但是消耗的性能也会更高。 |
如果想要我们的Camera自动在Path上移动,那么Cinemachine Dolly Cart组件可以帮助到我们。它可以约束带有它的GameObject在Cinemachine Path或Cinemachine Smooth Path上移动。
Path | 即指定一个Cinemachine Path或Cinemachine Smooth Path。 |
Update Method | 速度不为0时,移动Cart的时机。对于普通的组件更新使用Update,若想要同步物理模块,使用Fixed Update。 |
Position Units和Posiotion | 和Tracked Dolly中的相同,不重复介绍了。 |
Speed | Cart的移动速度,同样受到Position Units的影响。 |
该碰撞器就是为防止相机穿透墙体等障碍物
想要实现这种不会穿墙的摄像头效果,我们只需要在VirtualCamera的Extensions中添加CinemachineCollider即可。
Cinemachine Collider会对我们VirtualCamera的位置进行后期处理,来保持Camera的视线不会被障碍物所遮挡。添加了Cinemachine Collider后,VirtualCamera会做下列事情:
Cinemachine Collider原理是利用物理射线(Physics Raycaster)检测,因此需要潜在的障碍物都要带有碰撞体组件,这会导致性能消耗。若消耗过高,需要考虑使用其他方法来代替。
Collider Against | 当障碍物属于Collide Against设置中选择的Layer时,才会属于潜在障碍物,参与计算。该属性没有选择的Layer中的GameObject会被忽略。 |
Ignore Tag | 属于Ignore Tag设置中选择的Tag的GameObject会被忽略。 |
Transparent Layers | 属于Transparent Layers设置中选择的Layer的GameObject会被当做是透明物体,即不会遮挡住视线,会被忽略。 |
Minimum Distance From Target | 最小辨识距离,如果障碍物到目标轴心点的距离小于设置的值,会被忽略。 |
Avoid Obstacles | 若勾选,当目标被障碍物遮挡时,会移动我们的Camera来避开障碍物。 若不勾选,则不会尝试移动Camera来避开障碍物,但是会根据障碍物来报告shot quality。 |
Distance Limit | 设置从Camera射出射线的最大长度,若值为0即指Camera到目标的距离。超过该长度的障碍物会被忽略。 |
Minimum Occlusion Time | 设置一个时间,只有当障碍物遮挡住的目标的时间超过这个时间才会进行处理。这样可以忽略掉一些转瞬即逝的遮挡物。 |
Camera Radius | 指的是Camera到任何一个障碍物所需要保持的最小距离,值越大Camera会离潜在障碍物越远,尝试保持较小的值会有比较好的效果以及节省性能。如果由于Camera的FOV较大而看见一些内部障碍物,我们可以适当增加这个值。 |
Strategy | Camera防止被障碍物遮挡视线所尝试的方法,有如下三种: |
Strategy--Pull Camera Forward | Camera沿着自身的z轴方向向前移动,直到移动到距离目标最近的障碍物之前。 |
Strategy--Preserve Camera Height | 将相机移动到一个不会被障碍物遮挡视线的点,同时尝试保持Camera的原始高度不变。 |
Strategy--Preserve Camera Diatance | 将相机移动到一个不会被障碍物遮挡视线的点,同时尝试保持Camera到目标的原始距离不变。 |
Maximum Effect | 设置一次最多可处理多少个障碍物,值越大性能消耗越大,一般场景中设置为4就足够了。 |
Smoothing Time | Camera停留在离目标最近的点时的最小时间,即当视线中没有遮挡物时,Camera不会立即恢复到原始的偏移量,而会先保持一会当前的偏移量,保持时间取决于该属性设置的值。 适用于Camera需要经过很多障碍物的情况,可以避免Camera频繁的移动。 |
Damping | 当障碍物消失,Camera恢复到原始的偏移量的速度。值越大反应越慢。 |
Damping When Occluded | 当出现障碍物,Camera移动到避开障碍物位置的速度。值越大反应越慢。 |
Optimal Target Distance | 该属性主要应用于Clear Shot功能。设置为0的话代表关闭该功能,若设置了大于0的值,那么当目标到相机的距离越接近这个值,就会获得越高的评分。该评分在Clear Shot选择合适的VirtualCamera时会起到作用。 |