Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cinemachine简介「建议收藏」

Cinemachine简介「建议收藏」

作者头像
全栈程序员站长
发布于 2022-09-20 02:09:22
发布于 2022-09-20 02:09:22
9871
举报

  先贴一下官方的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,分别计算相机的位置、方向、噪音。

执行过程

  简单说就是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时举例。

Tips

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

VirtualCamera中State计算流程

  先看一下这个流水线在Hierarchy里长什么样子。   把CinemachineCore.sShowHiddenObjects设置为为true,可以看到虚拟相机下有一个cm节点。

  可以看到cm对象上挂了一个CinemachinePipeline脚本和对应的两个CinemechineComponent。   CinemachinePipeline并没有实际的逻辑作用,只是起一个标记作用,代表这个节点是一个Pipeline节点。   另外两个CinemachineComponent就是流水线中用于计算State的脚本。 State计算流程:

  State被一环一环的传递下去,每一步的计算都依赖于上一步计算出的State结果。   比如在Aim计算旋转角度时,就会依赖上一步Body计算出来的位置,以此位置为基础来计算旋转。

小结

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

  1. 对相机切换过程中的再次切换,多Timeline情况的处理,使相机的移动总是平滑的。
  2. 在Component的基础上加入Extensions来增加灵活度。
  3. 增加SmartUpdate来对相机的更新时机做动态调整。 等等。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
运行过程这段讲的太好了,尤其是那两张流程图,别的地方都没有,估计是研究透了源代码,赞
运行过程这段讲的太好了,尤其是那两张流程图,别的地方都没有,估计是研究透了源代码,赞
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Cinemachine(一)VirtualCamera和Brain的简单介绍「建议收藏」
在游戏中,摄像头的效果是非常重要的,将会直接影响到呈现在玩家眼中的画面,好的效果可以直接提高玩家的游戏体验,给予一种身临其境的感觉。例如在一个FPS游戏中,我们往往需要摄像头跟随我们的角色,做一些第一人称第三人称的切换,当角色进入室内时需要调整摄像头位置来防止被墙挡住,在使用倍镜时需要摄像头观察远处的画面等等。以为要实现这些效果我们需要编写很多的控制代码来控制我们的Camera,然而再有了Cinemachine之后,一切都会变得简单起来。
全栈程序员站长
2022/09/01
7K1
Unity Cinemachine插件全功能详解
实现电影级别的分镜,推拉式镜头等,需要2017以上的版本才能使用,配合TimeLine一起使用,和Animator一起.
全栈程序员站长
2022/06/27
2.5K0
Unity Cinemachine插件全功能详解
Unity虚拟相机Cinemachine教程[通俗易懂]
参数介绍: Live Camera:当前显示的相机 Live Blend:过度相机时显示进度 Show Debug Text:在Game视窗里显示当前使用的相机
全栈程序员站长
2022/09/01
5.9K1
Unity Cinemachine & Timeline 制作镜头动画
Cinemachine是Unity官方推出的一套相机管理解决方案,配合Timeline使用可以实现电影级别的分镜镜头,下面以一个车子移动的例子简单介绍Cinemachine和Timeline的配合使用。
CoderZ
2022/08/29
2.1K0
Unity Cinemachine & Timeline 制作镜头动画
Cinemachine初体验
可以直接从package manager里面安装(踩过的坑:导入samples时可能会出现sample和当前使用的unity版本不兼容的情况,更换版本即可)
全栈程序员站长
2022/09/02
6410
Cinemachine教程☀️ 一、本插件的基础功能
Brain:放在相机Camera上的一个组件。可对接无数多个虚拟相机VCam,控制相机镜头切换
星河造梦坊官方
2024/08/15
3830
Cinemachine教程☀️ 一、本插件的基础功能
Unity–Cinemachine官方实例详解
搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create 2D Camera,在生成的相机中设置follow,同时注意body的设置,如下图所示
全栈程序员站长
2022/08/24
1.8K0
Unity–Cinemachine官方实例详解
unity 的Cinemachine组件运用
通过Package Manager 安装CineMachine 1) 最简单的方法使用freeLook虚拟相机
全栈程序员站长
2022/08/27
2K0
unity 的Cinemachine组件运用
Cinemachine(四)在路径/轨道上移动的摄像头(Cinemachine Dolly Camera,Path And Cart)
在很多游戏的开场动画或者CG里,我们往往会碰见一些很酷炫的镜头效果。例如一个场景,我们的画面会从远处可以观察到整个场景到被拉近视角观察到场景中的主角。又或者一些CG动画中,我们的视角会像一直飞翔的老鹰一样,掠过整个场景。
全栈程序员站长
2022/09/02
1.9K0
Cinemachine使用
根据BeaverJoe教程总结笔记,素材来源:https://www.bilibili.com/video/BV1oa4y1s7gg
全栈程序员站长
2022/09/01
8190
cinemachine_2D Cinemachine:提示和技巧「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 cinemachine Have you been working on a camera system for your 2D game for age
全栈程序员站长
2022/09/01
5600
Cinemachine(三)自动选择/切换最适合的摄像头(Cinemachine Clear Shot Camera)「建议收藏」
在很多的解谜类游戏中,场景中往往会有很多密室,玩家需要在不同的房间中来回穿梭,除了第三人称摄像头外,我们也可以通过在不同的房间中布置不同的Camera,然后当角色到达指定房间后开启对应的Camera来处理。类似的效果如下图:
全栈程序员站长
2022/08/24
4480
Cinemachine(三)自动选择/切换最适合的摄像头(Cinemachine Clear Shot Camera)「建议收藏」
Unity3D使用Cinemachine配合Timeline实现运镜效果
Unity3D中的插件Cinemachine高级虚拟摄像系统,配合Timeline时间轴一起使用,可以实现像电影级别的分镜等效果,这篇我们就继续用上个模拟收费通过的项目,在这个基础上使用Cinemachine配合Timeline实现一个运镜的效果。
Vaccae
2020/09/01
3.6K0
Unity3D使用Cinemachine配合Timeline实现运镜效果
unity3d 入门[通俗易懂]
vscode直接加载文件夹,不要使用unity右键打开项目,unity2019bug导致vscode打开后没有界面,后才占用项目,不能右键打开。
全栈程序员站长
2022/09/22
3.7K0
unity3d 入门[通俗易懂]
unity3d 入门
vscode直接加载文件夹,不要使用unity右键打开项目,unity2019bug导致vscode打开后没有界面,后才占用项目,不能右键打开。
sofu456
2022/05/06
2.9K0
unity3d 入门
【游戏开发实战】2D游戏摄像机镜头跟随,屏幕边缘限制镜头移动(使用Cinemachine组件)
嗨,大家好,我是新发。 有老铁留言问我能不能写一下2D镜头跟随以及人物移动到屏幕边缘限制镜头的文章,
全栈程序员站长
2022/09/01
2.1K0
一、事件函数的执行顺序(脚本的生命周期)
上图概括了unity如何在脚本的生命周期内对事件函数进行排序以及重复执行这些事件函数。
酱紫安
2020/07/20
2.7K0
unity3d自学教程_3D技巧
Unity3D软件是由Unity Technologies公司提供的综合开发环境,主要面向游戏开发人员、虚拟现实设计师等,可用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型的多媒体内容,并支持这些内容在Windows、iOS、Android等多种平台的发布,功能非常强大。
全栈程序员站长
2022/09/22
3.5K0
unity3d自学教程_3D技巧
【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️
答:Awake —> OnEnable —> Start —> FixedUpdate —>Update —> LateUpdate—> OnGUl —> OnDisable —> OnDestroy
呆呆敲代码的小Y
2023/07/24
3K0
【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️
Cinemachine(二)制作不会穿墙(会避开障碍物)的摄像头(Cinemachine Collider)
在许多的第三人称游戏中,我们的摄像机往往保持着一定的偏移,跟随着我们的角色。但是常常会出现的一种情况就是,当我们的角色走进室内或者靠近墙边或障碍物的时候,如果这个偏移保持不变的话,我们的摄像机就可能会跑到墙体里,或者看向角色时被墙体或障碍物所挡住。因此这种情况下我们的相机往往需要一些特殊的处理,例如修改偏移量来拉近相机与角色的距离等,来防止上述情况的出现。
全栈程序员站长
2022/08/24
1.3K0
Cinemachine(二)制作不会穿墙(会避开障碍物)的摄像头(Cinemachine Collider)
推荐阅读
相关推荐
Cinemachine(一)VirtualCamera和Brain的简单介绍「建议收藏」
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档