Cinemachine简介
先贴一下官方的Cinemachine文档Cinemachine Documentation
简介
使用
我们第一次使用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是挂在相机对象上去真正影响相机位置的脚本。主要负责以下三件事:
- 维护虚拟相机的状态(主要包括当前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)。
虚拟相机的基类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详细调用流程
主要可以分为两个时间节点和三件事。
- 时间节点
- FixedUpdate之后
- LateUpdate
- 三件事
- 维护虚拟相机的状态,永远在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来对相机的更新时机做动态调整。
等等。
Cinemachine简介的更多相关文章
- Unity User Group深圳站——Timeline & Cinemachine分享
报名说明:UUG深圳站,2月分享活动正式启动,1月29日中午12:00前报名可获赠Unity精美纪念礼物一份~ 关于Unity Unity 是一款多平台的综合型游戏开发工具,它的出现对蓬勃发展的全球游 ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
随机推荐
- jsp页面链接文件
Myeclipse中jsp页面链接css文件不生效问题 jsp页面在外链css文件后,样式表不生效,查了很多方法,都说是路径问题改了很多次也不行. 例如改为: <link rel="s ...
- 标题艺术与技术的完美结合,LG画廊OLED电视正式发布!
由LG电子举办的"旷世巨作---面向未来的电视"主题沙龙于3月10号在王府井亚洲首家数字化奥迪展厅拉开帷幕.此次活动宣布了LG画廊OLED电视在国内市场上市.而我有幸参加了此次 ...
- 【Vue 学习笔记 一、Vue开发环境搭建】
搭建Vue的开发环境 1.首先安装Nodejs (因为我的系统是Windows的所以就选择第一个了,这个看个人的开发环境) 下载好后,然后一路确定,如果有更改安装目录的需求,就自己切换安装目录,由于 ...
- deeplearning.ai 改善深层神经网络 week1 深度学习的实用层面
1. 应用机器学习是高度依赖迭代尝试的,不要指望一蹴而就,必须不断调参数看结果,根据结果再继续调参数. 2. 数据集分成训练集(training set).验证集(validation/develop ...
- cs231n spring 2017 lecture7 Training Neural Networks II
1. 优化: 1.1 随机梯度下降法(Stochasitc Gradient Decent, SGD)的问题: 1)对于condition number(Hessian矩阵最大和最小的奇异值的比值)很 ...
- c socket 开发测试
c语言异常 参照他人代码写一个tcp的 socket 开发测试 异常A,在mac osx系统下编译失败,缺库转到debian下. 异常B,include引用文件顺序不对,编译大遍异常 异常C,/usr ...
- Token最主要的作用.个人观点
Token除了登陆验证以外,我个人觉得最主要的作用就是可反解,通过token可以在服务器端查找出Token相关信息.这样可以省去一些不必要的参数. 关于token是否可以代替session来使用看个人 ...
- 吴裕雄--天生自然python编程:实例(1)
str = "www.runoob.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字符中 ...
- TCP 的三次握手和四次挥手
参考资料: 1.TCP的三次握手与四次挥手理解及面试题: 2.Http协议三次握手和四次挥手: 3.TCP通信的三次握手和四次撒手的详细流程(顿悟) 前置: 序号(也称序列号) - Sequence ...
- JXJJOI2018_三题
这次比赛的话其实还挺满意的,虽然T1 20pts(指的是分数,考试时知道有坑但是考完都没找到的我就知道切不掉这题qwq),T3爆零是在意料之外,不过其实T2贪心能切掉也是意料之外的,所以作此判断.当然 ...