先贴一下官方的Cinemachine文档Cinemachine Documentation
我们第一次使用Cinemachine时大概是这样一个流程:
简单说就是CinemachineBrain每帧通过VirtualCamera计算真实相机的位置,并同步到真实相机上。 真正的数据计算又是通过VirtualCamera上的流水线来计算的。 这里只是一个简化的流程说明,真实计算还有相机切换时的混合、流水线之外的Extension、和CinemachineCore对Cinemachine的全局管理等。
简单了解运行流程后,在详细的说一下这几个类的实现与功能。
CinemachineBrain是挂在相机对象上去真正影响相机位置的脚本。主要负责以下三件事:
在做一些相机跟随、3DUI跟随时,要注意一帧中跟随对象位置计算、虚拟相机State的计算、State结果同步、3DUI位置计算的顺序,否则容易出现相机抖动的问题。 如果确定相机跟随的物体运动的时间点,可以选择LateUpdate或FixedUpdate两种模式。能省去SmartUpdate时对目标物体的追踪开销(就是那个UpdateTracker)。
通过流水线的方式调用CinemachineComponent,同时在流水线中插入CinemachineExtension来计算相机的位置,具体是通过挂载的CinemachineComponent和CinemachineExtension来流水线式的计算一个CameraState(包含了位置、旋转、视角、额外偏移值等数据),通过CinemachineBrain将其中的数据同步到真实相机上。
通过VirtualCamera来创建、删除、调用,主要分三大类Body、Aim、Noise(还有一个Final,很少用)。
插入在流水线中间调用,也用于维护CameraState。
一个全局的管理类,保存当前所有有效的CinemachineBrain、VirturalCameraBase对象引用,定义了各种全局类和函数,用于Cinemachine系统的整体调度。
主要可以分为两个时间节点和三件事。
流程: 用UpdateMethod和BlendUpdateMethod都为LateUpdate时举例。
Tips
先看一下这个流水线在Hierarchy里长什么样子。 把CinemachineCore.sShowHiddenObjects设置为为true,可以看到虚拟相机下有一个cm节点。
可以看到cm对象上挂了一个CinemachinePipeline脚本和对应的两个CinemechineComponent。 CinemachinePipeline并没有实际的逻辑作用,只是起一个标记作用,代表这个节点是一个Pipeline节点。 另外两个CinemachineComponent就是流水线中用于计算State的脚本。 State计算流程:
State被一环一环的传递下去,每一步的计算都依赖于上一步计算出的State结果。 比如在Aim计算旋转角度时,就会依赖上一步Body计算出来的位置,以此位置为基础来计算旋转。
这里只是基本的讲了一下Cinemachine的工作流程。没有深入到每个类型的虚拟相机。但是对基本流程有一个大体的把握后,再去看其他部分应该会轻松一点。 其次我们也了解到Cinemachine的核心工作流并不复杂,就那么几步。代码的复杂度主要集中在各种边界情况和优化上。比如:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168432.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有