先贴一下官方的Cinemachine文档Cinemachine Documentationhtml
简介
使用
咱们第一次使用Cinemachine时大概是这样一个流程:函数
- 在须要被控制的Camera上添加一个CinemachineBrain。
- 建立一个本身须要的VirtualCamera。
- 调整VirturalCamera上的Follow、Look At等参数。
- 调整VirtualCamera上Body、Aim对应Component的类型和参数。
3个关键类简介
- CinemachineBrain
CinemachineBrain是挂在相机对象上去真正修改相机位置的脚本。负责经过VirtualCamera来计算真实相机的位置。
- VirtualCameraBase
经过CinemachineCompoent来计算相机位置。
- CinemachineComponentBase
主要分三大类Body、Aim、Noise,分别计算相机的位置、方向、噪音。
执行过程

简单说就是CinemachineBrain每帧经过VirtualCamera计算真实相机的位置,并同步到真实相机上。
真正的数据计算又是经过VirtualCamera上的流水线来计算的。
这里只是一个简化的流程说明,真实计算还有相机切换时的混合、流水线以外的Extension、和CinemachineCore对Cinemachine的全局管理等。性能
重要脚本
简单了解运行流程后,在详细的说一下这几个类的实现与功能。优化
CinemachineBrain
CinemachineBrain是挂在相机对象上去真正影响相机位置的脚本。主要负责如下三件事:3d
- 维护虚拟相机的状态(主要包括当前Brain受哪一个虚拟相机控制、虚拟相机切换时的切换进度、Timeline对Brain的影响)。
- 经过虚拟相机计算State(虚拟相机经过各类参数计算出来的真实相机的状态,包括位置、旋转等)。
- 将虚拟相机的State同步到真实相机上,多是多个虚拟相机的State混合后的结果。
重要变量
- UpdateMethed
更新全部与该Brain相关的虚拟相机,主要是计算每一个VirtualCamera的State。
- SmartUpdate:判断在必定时间(具体是经过UpdateTracker实现的。这个必定时间实际上是一个固定的帧数:UpdateStatus.kWindowSize,是个常数30)该虚拟相机的target在fixedUpdate移动次数多仍是在lateupdate移动的次数多。来判断下一段时间用fixedUpdate仍是lateUpdate。
- FixedUpdate:在FixedUpdate以后对虚拟相机进行更新。
- LateUdpate:在LateUpdate时对虚拟相机进行更新。
- BlendUpdateMethod:把VirtualCamera计算的结果同步到CinemachineBrain的时机。
- FixedUpdate:在FixedUpdate以后对将计算的数据同步到真实相机。
- LateUdpate:在LateUpdate时计算的数据同步到真实相机。
重要类
- BrainFrame
更新并记录当前Brain受哪一个虚拟相机的的控制、同时计算虚拟相机的切换状态。
Brain中的mFrameStack是用来处理多Timeline同时生效的状况。
FrameStack中的第一个Frame是Brain每帧Tick游戏中虚拟相机的结果。其余的是TimeLine的。
- CinemachineBlend
相机混合类,用于描述从相机A切换到相机B的过程。
- BlendSourceVirtualCamera
将CinemachineBlend封装成一个VirtualCamera,可让A相机在切换到B相机的过程当中又切换到C这种状况有一个平滑的过分。
Tips
在作一些相机跟随、3DUI跟随时,要注意一帧中跟随对象位置计算、虚拟相机State的计算、State结果同步、3DUI位置计算的顺序,不然容易出现相机抖动的问题。
若是肯定相机跟随的物体运动的时间点,能够选择LateUpdate或FixedUpdate两种模式。能省去SmartUpdate时对目标物体的追踪开销(就是那个UpdateTracker)。component
虚拟相机的基类VirtualCameraBase
经过流水线的方式调用CinemachineComponent,同时在流水线中插入CinemachineExtension来计算相机的位置,具体是经过挂载的CinemachineComponent和CinemachineExtension来流水线式的计算一个CameraState(包含了位置、旋转、视角、额外偏移值等数据),经过CinemachineBrain将其中的数据同步到真实相机上。htm
虚拟相机组件的基类CinemachineComponentBase
经过VirtualCamera来建立、删除、调用,主要分三大类Body、Aim、Noise(还有一个Final,不多用)。对象
- Body主要用来计算相机的原始位置,也就是state中的RawPosition。
- Aim主要用来计算相机的原始旋转,也就是state中的RawRotation。
- Noise主要用来计算相机的额外偏移值,也就是state中的PositionCorrection和RotationCorrection。
CinemachineExtension
插入在流水线中间调用,也用于维护CameraState。blog
CinemachineCore
一个全局的管理类,保存当前全部有效的CinemachineBrain、VirturalCameraBase对象引用,定义了各类全局类和函数,用于Cinemachine系统的总体调度。游戏
运行过程
CinemachineBrain详细调用流程
主要能够分为两个时间节点和三件事。
- 时间节点
- 三件事
- 维护虚拟相机的状态,永远在LateUpdate。
- 经过虚拟相机计算State,根据UpdateMethod的设置,在FixedUpdate以后或LateUpdate。
- 将虚拟相机的State同步到真实相机上,根据BlendUpdateMethod的设置,在FixedUpdate以后或LateUpdate。
流程:
用UpdateMethod和BlendUpdateMethod都为LateUpdate时举例。

Tips
- 在更新相机时,会经过UpdateStatus来保证每一个相机每帧不会被屡次更新。以避免形成性能浪费。
VirtualCamera中State计算流程
先看一下这个流水线在Hierarchy里长什么样子。
把CinemachineCore.sShowHiddenObjects设置为为true,能够看到虚拟相机下有一个cm节点。


能够看到cm对象上挂了一个CinemachinePipeline脚本和对应的两个CinemechineComponent。
CinemachinePipeline并无实际的逻辑做用,只是起一个标记做用,表明这个节点是一个Pipeline节点。
另外两个CinemachineComponent就是流水线中用于计算State的脚本。
State计算流程:

State被一环一环的传递下去,每一步的计算都依赖于上一步计算出的State结果。
好比在Aim计算旋转角度时,就会依赖上一步Body计算出来的位置,以此位置为基础来计算旋转。
小结
这里只是基本的讲了一下Cinemachine的工做流程。没有深刻到每一个类型的虚拟相机。可是对基本流程有一个大致的把握后,再去看其余部分应该会轻松一点。
其次咱们也了解到Cinemachine的核心工做流并不复杂,就那么几步。代码的复杂度主要集中在各类边界状况和优化上。好比:
- 对相机切换过程当中的再次切换,多Timeline状况的处理,使相机的移动老是平滑的。
- 在Component的基础上加入Extensions来增长灵活度。
- 增长SmartUpdate来对相机的更新时机作动态调整。 等等。