Cinemachine简介「建议收藏」

Cinemachine简介「建议收藏」先贴一下官方的Cinemachine文档"CinemachineDocumentation"简介使用我们第一次使用Cinemachine时大概是这样一个流程:1.在需

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  先贴一下官方的Cinemachine文档Cinemachine Documentation

简介

使用

  我们第一次使用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,分别计算相机的位置、方向、噪音。

执行过程

Cinemachine简介「建议收藏」
  简单说就是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时举例。
Cinemachine简介「建议收藏」
Tips

  1. 在更新相机时,会通过UpdateStatus来保证每个相机每帧不会被多次更新。以免造成性能浪费。

VirtualCamera中State计算流程

  先看一下这个流水线在Hierarchy里长什么样子。
  把CinemachineCore.sShowHiddenObjects设置为为true,可以看到虚拟相机下有一个cm节点。
Cinemachine简介「建议收藏」
Cinemachine简介「建议收藏」
  可以看到cm对象上挂了一个CinemachinePipeline脚本和对应的两个CinemechineComponent。
  CinemachinePipeline并没有实际的逻辑作用,只是起一个标记作用,代表这个节点是一个Pipeline节点。
  另外两个CinemachineComponent就是流水线中用于计算State的脚本。
State计算流程:
Cinemachine简介「建议收藏」
  State被一环一环的传递下去,每一步的计算都依赖于上一步计算出的State结果。
  比如在Aim计算旋转角度时,就会依赖上一步Body计算出来的位置,以此位置为基础来计算旋转。

小结

  这里只是基本的讲了一下Cinemachine的工作流程。没有深入到每个类型的虚拟相机。但是对基本流程有一个大体的把握后,再去看其他部分应该会轻松一点。
  其次我们也了解到Cinemachine的核心工作流并不复杂,就那么几步。代码的复杂度主要集中在各种边界情况和优化上。比如:

  1. 对相机切换过程中的再次切换,多Timeline情况的处理,使相机的移动总是平滑的。
  2. 在Component的基础上加入Extensions来增加灵活度。
  3. 增加SmartUpdate来对相机的更新时机做动态调整。
    等等。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168432.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月3日 下午7:16
下一篇 2022年8月3日 下午7:36


相关推荐

  • ceph scrub实现机制

    ceph scrub实现机制0 scrubpg 注册及触发 pg 注册完之后由 osdtick 线程根据时间和系统压力决定是否启动 scrubpg 如果满足上述条件则会加入 scrub wq 队列 唤醒相应的工作线程进行处理 scrub 处理过程是由 disk tp 线程从 scrub wq 队列取 PG 进行的 一般的主要过程为 PrimaryABCIN MAP request scrub map r

    2026年3月19日
    2
  • java 项目日志管理设计方案[通俗易懂]

    java 项目日志管理设计方案[通俗易懂]java项目日志管理设计方案因项目需要记录整个系统的操作记录,考虑到系统操作日志的数据量,单表很容易达到瓶颈,导致查询效率低下,顾使用分表方案,减小数据库的负担,缩短查询时间。目前对于分表的解决方案有很多,但本篇博文主要讲解博主自行实现的日志管理的解决方案1创建日志表1.1日志表Sql语句如下具体表设计随项目情况而变化表创建SQL语句CREATETABLE`sys_user

    2022年5月20日
    36
  • 局域网打印机共享怎么设置_局域网如何共享打印机

    局域网打印机共享怎么设置_局域网如何共享打印机如果将打印机共享后就不用每次都拿着资料去连接打印机的主机上打印了 那么该怎么在局域网中共享打印机呢 小伙伴们应该怎么操作呢 在网上教程虽然很多 但是有些细节性的东西很容易忽略掉 小编这里整理了一份详细的共享打印机教程 1 在桌面上 我的电脑 图标中鼠标右键点击 属性 2 在跳转的界面中 点击 控制面板主页 3 找到并点击 设备和打印机 4 在你需要共享的打印机中右键点击 选择

    2025年10月29日
    6
  • 细说MySQL的时间戳(Timestamp)类型

    细说MySQL的时间戳(Timestamp)类型转载生产环境中部署着各种版本的 MySQL 包括 MySQL5 5 5 6 5 7 三个大版本和 N 个小版本 由于 MySQL 在向上兼容性较差 导致相同 SQL 在不同版本上表现各异 下面从几个方面来详细介绍时间戳数据类型 nbsp 时间戳数据存取 nbsp nbsp 在 MySQL 上述三个大版本中 默认时间戳 Timestamp 类型的取值范围为 1970 01 0100 00 01 UTC nbsp 至 2038 01 1903 14

    2026年3月16日
    4
  • 效率倍增,推荐6个好用到爆的Pycharm插件

    效率倍增,推荐6个好用到爆的Pycharm插件相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的。今天我来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。喜欢本文点赞、收藏、关注。部分插件技术群朋友分享,在此表示感谢。【文末】提供技术交流群安装方法插件的安装方法一点都不难打开file—settings—plugins,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件找到我们所需要的对应插件之后,点击install即可完成下载,然后重

    2022年8月29日
    4
  • linux sort命令 排序,Linux sort排序方法[通俗易懂]

    linux sort命令 排序,Linux sort排序方法[通俗易懂]在文件的操作过程中,因为文件过多,往往需要进行一下排序,排序方法也就是从小到大排序或者从大到小排序。比如我们从nginx日志中需要找到访问量最长的url,那就需要对请求时间进行一个排序,根据请求时间长短排序后在打印后面的url就能清楚的知道那个url有问题了,废话先不说,看方法:文件排序我们先说一下linux的sort命令,sort命令可以根据我们的需求完成从大到小或者从小到大的排序。注意:sor…

    2022年8月12日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号