Cinemachine简介

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Cinemachine简介

blueberryzzz   2020-03-10 我要评论
  先贴一下官方的Cinemachine文档[Cinemachine Documentation](https:/https://img.qb5200.com/download-x/docs.unity3d.com/Packages/com.unity.cinemachine@2.2/manual/index.html) # 简介 ## 使用   **我们第一次使用Cinemachine时大概是这样一个流程:** 1. 在需要被控制的Camera上添加一个CinemachineBrain。 2. 创建一个自己需要的VirtualCamera。 3. 调整VirturalCamera上的Follow、Look At等参数。 4. 调整VirtualCamera上Body、Aim对应Component的类型和参数。 ## 3个关键类简介 1. CinemachineBrain   CinemachineBrain是挂在相机对象上去真正修改相机位置的脚本。负责通过VirtualCamera来计算真实相机的位置。 2. VirtualCameraBase   通过CinemachineCompoent来计算相机位置。 3. CinemachineComponentBase   主要分三大类Body、Aim、Noise,分别计算相机的位置、方向、噪音。 ## 执行过程 ![](https://img2020.cnblogs.com/blog/1362861/202003/1362861-20200310003350762-636483570.jpg)   简单说就是CinemachineBrain每帧通过VirtualCamera计算真实相机的位置,并同步到真实相机上。   真正的数据计算又是通过VirtualCamera上的流水线来计算的。   这里只是一个简化的流程说明,真实计算还有相机切换时的混合、流水线之外的Extension、和CinemachineCore对Cinemachine的全局管理等。 # 重要脚本   简单了解运行流程后,在详细的说一下这几个类的实现与功能。 ## CinemachineBrain   CinemachineBrain是挂在相机对象上去真正影响相机位置的脚本。主要负责以下三件事: - 维护虚拟相机的状态(主要包括当前Brain受哪个虚拟相机控制、虚拟相机切换时的切换进度、Timeline对Brain的影响)。 - 通过虚拟相机计算State(虚拟相机通过各种参数计算出来的真实相机的状态,包括位置、旋转等)。 - 将虚拟相机的State同步到真实相机上,可能是多个虚拟相机的State混合后的结果。 ### 重要变量 1. UpdateMethed   更新所有与该Brain相关的虚拟相机,主要是计算每个VirtualCamera的State。 - SmartUpdate:判断在一定时间(具体是通过UpdateTracker实现的。这个一定时间其实是一个固定的帧数:UpdateStatus.kWindowSize,是个常数30)该虚拟相机的target在fixedUpdate移动次数多还是在lateupdate移动的次数多。来判断下一段时间用fixedUpdate还是lateUpdate。 - FixedUpdate:在FixedUpdate之后对虚拟相机进行更新。 - LateUdpate:在LateUpdate时对虚拟相机进行更新。 2. BlendUpdateMethod:把VirtualCamera计算的结果同步到CinemachineBrain的时机。 - FixedUpdate:在FixedUpdate之后对将计算的数据同步到真实相机。 - LateUdpate:在LateUpdate时计算的数据同步到真实相机。 ### 重要类 1. **BrainFrame**   更新并记录当前Brain受哪个虚拟相机的的控制、同时计算虚拟相机的切换状态。   Brain中的mFrameStack是用来处理多Timeline同时生效的情况。   FrameStack中的第一个Frame是Brain每帧Tick游戏中虚拟相机的结果。其他的是TimeLine的。 2. **CinemachineBlend**   相机混合类,用于描述从相机A切换到相机B的过程。 3. **BlendSourceVirtualCamera**   将CinemachineBlend封装成一个VirtualCamera,可以让A相机在切换到B相机的过程中又切换到C这种情况有一个平滑的过度。 ### Tips   在做一些相机跟随、3DUI跟随时,要注意一帧中跟随对象位置计算、虚拟相机State的计算、State结果同步、3DUI位置计算的顺序,否则容易出现相机抖动的问题。   如果确定相机跟随的物体运动的时间点,可以选择LateUpdate或FixedUpdate两种模式。能省去SmartUpdate时对目标物体的追踪开销(就是那个UpdateTracker)。 ## 虚拟相机的基类VirtualCameraBase   通过流水线的方式调用CinemachineComponent,同时在流水线中插入CinemachineExtension来计算相机的位置,具体是通过挂载的CinemachineComponent和CinemachineExtension来流水线式的计算一个CameraState(包含了位置、旋转、视角、额外偏移值等数据),通过CinemachineBrain将其中的数据同步到真实相机上。 ## 虚拟相机组件的基类CinemachineComponentBase   通过VirtualCamera来创建、删除、调用,主要分三大类Body、Aim、Noise(还有一个Final,很少用)。 - Body主要用来计算相机的原始位置,也就是state中的RawPosition。 - Aim主要用来计算相机的原始旋转,也就是state中的RawRotation。 - Noise主要用来计算相机的额外偏移值,也就是state中的PositionCorrection和RotationCorrection。 ## CinemachineExtension   插入在流水线中间调用,也用于维护CameraState。 ## CinemachineCore   一个全局的管理类,保存当前所有有效的CinemachineBrain、VirturalCameraBase对象引用,定义了各种全局类和函数,用于Cinemachine系统的整体调度。 # 运行过程 ## CinemachineBrain详细调用流程   主要可以分为两个时间节点和三件事。 1. 时间节点 - FixedUpdate之后 - LateUpdate 2. 三件事 - 维护虚拟相机的状态,永远在LateUpdate。 - 通过虚拟相机计算State,根据UpdateMethod的设置,在FixedUpdate之后或LateUpdate。 - 将虚拟相机的State同步到真实相机上,根据BlendUpdateMethod的设置,在FixedUpdate之后或LateUpdate。 **流程:**   用UpdateMethod和BlendUpdateMethod都为LateUpdate时举例。 ![](https://img2020.cnblogs.com/blog/1362861/202003/1362861-20200310003421487-395232664.jpg) **Tips** 1. 在更新相机时,会通过UpdateStatus来保证每个相机每帧不会被多次更新。以免造成性能浪费。 ## VirtualCamera中State计算流程   先看一下这个流水线在Hierarchy里长什么样子。   把CinemachineCore.sShowHiddenObjects设置为为true,可以看到虚拟相机下有一个cm节点。 ![](https://img2020.cnblogs.com/blog/1362861/202003/1362861-20200310003442050-1639662295.png) ![](https://img2020.cnblogs.com/blog/1362861/202003/1362861-20200310003450026-690632282.png)   可以看到cm对象上挂了一个CinemachinePipeline脚本和对应的两个CinemechineComponent。   CinemachinePipeline并没有实际的逻辑作用,只是起一个标记作用,代表这个节点是一个Pipeline节点。   另外两个CinemachineComponent就是流水线中用于计算State的脚本。 **State计算流程:** ![](https://img2020.cnblogs.com/blog/1362861/202003/1362861-20200310003504739-1720455891.jpg)   State被一环一环的传递下去,每一步的计算都依赖于上一步计算出的State结果。   比如在Aim计算旋转角度时,就会依赖上一步Body计算出来的位置,以此位置为基础来计算旋转。 # 小结   这里只是基本的讲了一下Cinemachine的工作流程。没有深入到每个类型的虚拟相机。但是对基本流程有一个大体的把握后,再去看其他部分应该会轻松一点。   其次我们也了解到Cinemachine的核心工作流并不复杂,就那么几步。代码的复杂度主要集中在各种边界情况和优化上。比如: 1. 对相机切换过程中的再次切换,多Timeline情况的处理,使相机的移动总是平滑的。 2. 在Component的基础上加入Extensions来增加灵活度。 3. 增加SmartUpdate来对相机的更新时机做动态调整。 等等。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们