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来对相机的更新时机做动态调整。
    等等。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Origin2018安装与使用(整理中)

    Origin2018安装与使用(整理中)文章目录1.origin下载安装2.绘图前的一些必要设置3.折线图4.绘制双Y轴图1.origin下载安装Origin2018(32/64位)下载地址:链接:https://pan.baidu.com/s/1tgLxqeLoBp5DuL-hqlUDsg密码:v46x安装教程:https://jingyan.baidu.com/article/454316abde29f5f7a6c03a69.html2.绘图前的一些必要设置Origin绘图前的一些必要设置及了解1.项目管理器、对象

  • 无聊日常——对QQ邮箱盗号邮件的垃圾账号填充

    无聊日常——对QQ邮箱盗号邮件的垃圾账号填充本篇关键字:QQ盗号,域名分析,目录扫描,垃圾信息倾倒最近收到一封诡异的邮件,如下图:好奇的我扫码进去看到了qqmail的登录界面,直觉告诉我这是个假粉丝!(重庆腔)咳…是假的网站,进一步发现它的地址为:http://dhdjfekljjf.jcikiybk.lsdhdjeicgj.com.cn/mail1/嗯…下面就开始搞事了。(咦?自动变绿?)首先1、猜它的所有目录首先解析域…

  • JAVAdebug_java如何设置断点

    JAVAdebug_java如何设置断点大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以eclipse为例,debug的用法:1、首先在一个java文件中设断点,然后debugas,opendebugDialog,然后在对话框中选类后,Run。2、F5键与F6键均为单步调试,F5是stepinto,也就是进入本行代码中执行,F6是stepover,也就是执行本行代码,跳到下一行。3、F7是跳出函数,F8是…

    2022年10月15日
  • outputstreamwriter和filewriter_类文件解析

    outputstreamwriter和filewriter_类文件解析|–字符流(字符流=字节流+编码表。)|–字符输入流Reader——抽象类intread():一次读取一个字符intread(char[]chs):一次读取一…

  • plsql直接连接远程数据库_mysql切换数据库命令

    plsql直接连接远程数据库_mysql切换数据库命令前言每次安装Oracle以后,都会出现使用plsql连接不上的问题!多次重启电脑、重装系统的磨人经历之后,终于做出这么一篇文章,希望能帮助广大技术人员减少一些时间,顺利进行连接。注:也可以用plsql连接远程数据库(只要有oracle的network\admin\tnsnames.ora就行)。首先下载64位oracle以及32位轻量级客户端(注意版本的对应,我用的是11g的oracl……

  • YUI Compressor

    YUI Compressor简介根据雅虎卓越性能团队的说法,40%到60%的雅虎用户拥有空闲缓存体验,所有页面浏览量中约有20%是使用空缓存完成的(请参阅TenniTheurer在YUIBlog上的这篇文章)有关浏览器缓存使

发表回复

您的电子邮箱地址不会被公开。

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