目录
- 一 速览
- 1.1 cinemachine下载
- 1.2 官方示例速览
- 1.3 cinemachine定义
- 二 cinemachine详解
- 2.1 Virtual Camera
- 2.1.1 virtual camera参数通览
- 2.1.2 Status
- 2.1.3 有关Dutch angle
- 2.1.4 Standby Update
- 2.1.5 Transitions
- 2.2 virtual cameral关键参数详解
- 2.2.1 Body
- 2.2.1.1 Do Nothing
- 2.2.1.2 3rd Person follow
- 2.2.1.3 Framing Transposer
- Framing Transposer参数详解
- 2.2.1.4 Hard Lock to Target
- 2.2.1.5 Transposer
- 2.2.1.6 Orbital Transposer
- 2.2.1.7 Tracked Dolly
- 2.2.2 Aim
- 2.2.3 Noise
- 2.2.4 extension简览
- 2.3 Cinemachine Brain
- 2.3.1 Cinemachine Brain 参数详解
- 三 总结
- 四 感想
转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/131266126
主要参考:
- 官方手册 Cinemachine Documentation(虽然拉但是权威,结合下面的中文版一起食用)
- up大智官方手册翻译版(文后附翻译版pdf)
- 知乎:Cinemachine Camera详细讲解和使用(大智版的简化版)
- (强烈推荐!!!)B站up IGBeginner0116
注:本文使用的unity版本是2021.3.25f,cinemachine版本为2.8.9
一 速览
1.1 cinemachine下载
在package manager安装cinemachine,并导入samples
1.2 官方示例速览
参考:Unity新手教程7.2.1-Cinemachine介绍安装和官方示例
1.3 cinemachine定义
Cinemachine是用于操作Unity摄像机的一套模块。Cinemachine解决了跟踪目标、合成、混合和切换镜头之间的复杂数学和逻辑问题。它旨在显著减少在开发过程中耗时的手动操作和脚本修订次数。
二 cinemachine详解
gameobject>cinemachine可以看到不同类型的camera
2.1 Virtual Camera
Cinemachine中的Virtual Camera(虚拟相机)可以说是最核心的组件。
使用Cinemachine时,你需要记住一个准则:场景中一般只有一个Unity相机(除了需要制作分屏等效果的时候),上面挂着CinemachineBrain脚本;其他相机使用虚拟相机,可以有很多个。
给场景添加一个虚拟相机的流程如下:
- 菜单栏,选择GameObject>Cinemachine > Create Virtual Camera。
Unity会在场景中添加一个GameObject,上面有一个Virtual Camera组件。如果你的Unity相机上没有CinemachineBrain脚本,Cinemachine也会自动添加CinemachineBrain脚本到Unity相机上。 - 如果相机需要跟随物体移动,指定一个物体到Follow属性上。虚拟相机会自动将Unity相机的位置和Follow物体保持相对位置,包括Follow物体移动的时候。
- 如果相机镜头需要保持对准物体,指定一个物体到Look At属性上,这样相机镜头就会一直对准这个物体。
- 虚拟相机还有很多属性,你可以根据需要设置,后面会详细讲解。可以为位置跟随和镜头对准设置不同的算法,通过调节参数得到不同感觉的相机。
Virtual Camera中的Aim,Body和Noise属性,用来控制相机在移动、旋转时的动画是什么样子。
2.1.1 virtual camera参数通览
变量 | 解释 |
---|---|
solo | 切换虚拟相机是否处于临时活动状态。使用此属性可在“游戏”视图中获得即时视觉反馈,以调整虚拟相机。 |
Status : Live/Standby/Disable | 当前这个虚拟相机的状态。 Live状态为当前该虚拟相机正在操控Unity真实相机,并且正在跟踪其目标并每帧更新一次。 Standby为当前该虚拟相机正在跟踪其目标并每帧更新一次,但它没有控制任何 Unity 摄像机。这是在场景中启用的虚拟摄像机的状态,但其优先级可能低于实时的虚拟摄像机。 Disable为该虚拟相机存在但不被允许使用在当前场景,他不能实时跟踪其目标,不消耗任何系统运算能力,但是可以在Timeline中生成并使用,如果参与混合也可使用。 |
Game Window Guides | 选中时,Game窗口会显示辅助线,显示出虚拟相机的各个属性。辅助开发调整参数属性。需要LookAt或者Follow属性其中一个以上有设置物体并选择相关算法。 |
Save During Play | 如果选中,运行中的虚拟相机属性可以被保存下来,退出Play状态不会被重置。 |
Priority | 优先级,调整该虚拟相机的优先级。CinemachineBrain会根据这一项来选择LiveCamera同步到UnityCamera中。在Timeline中不生效该选项。 |
Follow | 设置虚拟相机想要跟随的目标(Body Target),CinemachineComponent管道中的Body组件将会引用此目标并根据提供给它的规则和设置来定向 vcam。如果该项为空,则虚拟相机的坐标将会定义相机的坐标。 |
Look At | 设置虚拟相机想要关注的目标(Aim Target),CinemachineComponent管道中的Aim组件会将引用此目标并根据提供给它的规则和设置来定向 vcam。如果该项为空,则虚拟相机的变换方向将定义相机的方向。 |
Standby Update:Never/Always/Round Robin | 当虚拟相机处于Standby状态时的更新方式。 Never方式为不更新 Always方式为每一帧都更新 Round Robin为循环更新,将所有待命的虚拟相机按照优先级大小来进行每一帧的循环更新(例如有10个待命的相机,第一帧更新第一个相机,第2帧更新第2个相机,…,第11帧更新第1个相机,以此类推) |
Lens | 设置该虚拟相机的Lens属性,当该虚拟相机被激活且为活跃状态时,会将这些参数传递给Unity真实相机。其中Dutch为为镜头旋转(为屏幕空间)。 |
Transitions | 相机混合时的设置。 |
Body | CinemachineComponent管道中重要组件,重要设置参数,配合Follow使用 |
Aim | CinemachineComponent管道中重要组件,重要设置参数,配合LookAt使用 |
Noise | CinemachineComponent管道中重要组件,重要设置参数,可以实现模拟相机抖动效果 |
Extensions | 可以给虚拟相机添加额外的扩展。 |
2.1.2 Status
在任意时间,每个Virtual Camera处于下列的状态之一:
- Live活动状态:活动状态的虚拟相机会控制Unity相机。当Cinemachine Brain控制从一个虚拟相
机混合到下一个虚拟相机时,两个虚拟相机都处于活动状态。当混合结束后,只会有一个活动虚拟
相机。 - Standby待命状态:处于待命状态的虚拟相机并不控制Unity相机。但是它仍然跟随和瞄准它的目
标物体,并且每帧更新。处于待命状态的虚拟相机的优先级不高于活动状态的虚拟相机。 - Disable禁用状态:处于禁用状态的相机既不控制Unity相机也不会跟随或瞄准他的目标,也不占
用运行资源。想要禁用一个虚拟相机,只要禁用它的GameObject即可。在Scene窗口中,被禁用
的虚拟相机还会显示,但是是禁用状态。但是有特殊情况被禁用的相机仍然可以控制Unity相机:
虚拟相机正在参与混合或者Timeline控制。
2.1.3 有关Dutch angle
斜角镜头又称荷兰式镜头(英语:Dutch angle)、荷兰式上下直摇(Dutch tilt)或破水平,是一种剧烈移动镜头的电影拍摄手法,这种镜头手法通常用来表示迷失、迷惑的氛围,令画面失去平衡感。虽然名为“荷兰式”,这种手法和荷兰并无关系,而是德国表现主义电影作品的常用手法,因英文Dutch和德文Deutsch拼写相近而易混淆。具体的做法是在水平方向上倾斜镜头,令其与正常视角的水平线成一角度。
图片来源:游戏摄影和我的故事:在电子游戏中寻找定格的艺术
其他效果可参考:
干货 | 这种镜头快绝迹,我得看它最后一眼
Dutch angle很有意思,是电影镜头的倾斜角度,明明出自德国电影手法,为啥被冠以荷兰dutch,一查还真有渊源,不是简单的拼写相近混淆:
Dutch(荷兰)VS Deutsch(德国)
哪个名字才是荷兰的国名?Holland?还是Netherland?
Google还有一个有意思的彩蛋,搜索“Dutch angle”会有意想不到的场面哈哈哈哈。
2.1.4 Standby Update
Controls how often the virtual camera is updated when the virtual camera is not live.
当虚拟相机处于Standby状态时的更新方式。
- Never方式为不更新
- Always方式为每一帧都更新
- Round Robin为循环更新,将所有待命的虚拟相机按照优先级大小来进行每一帧的循环更新(例如有10个待命的相机,第一帧更新第一个相机,第2帧更新第2个相机,…,第11帧更新第1个相机,以此类推)
2.1.5 Transitions
从其他虚拟相机转移过来影响本虚拟相机的参数。
- Blend Hints:Provides hints for blending positions to and from the virtual camera.
- None:无,默认线性混合
- Spherical Position:根据Look At的物体球面旋转混合
- Cylindrical Position:根据Look At的物体柱面旋转混合(水平方向圆弧,垂直方向线性)
- Screen Space Aim When Target:在屏幕空间瞄准目标
- Inherit Position
当这个虚拟相机激活成活跃状态时,从上一个相机继承位置,保持两个相机位置相同。
2.2 virtual cameral关键参数详解
2.2.1 Body
CinemachineVitualCamera组件中的Body属性用于设置相机移动时使用什么算法。需要首先设置
Follow属性。
Cinemachine包含以下移动相机的算法:
- Do Nothing: 不移动虚拟相机
- 3rd Person follow: 将相机围绕玩家水平和垂直旋转到跟随目标
- Framing Transposer: 在屏幕空间,保持相机和跟随目标的相对位置,可以设置阻尼。
- Hard Lock to Target: 虚拟相机和跟随目标使用相同位置
- Orbital Transposer: 相机和跟随目标的相对位置是可变的,还能接收用户的输入。
- Tracked Dolly: 相机沿着预先设置的轨道移动。
- Transposer: 相机和跟随目标的相对位置固定,可以设置阻尼。
2.2.1.1 Do Nothing
选中这个算法时,激活时Unity相机会固定在当前虚拟相机的位置,不会移动。用于固定位置的镜头,
也可以通过自定义脚本来控制相机的位置。
2.2.1.2 3rd Person follow
使用Cinemachine Virtual Camera的第三人称跟随功能,可以将相机保持在相对于跟随目标的恒定位置和距离(受到阻尼控制的影响),跟踪目标的移动和旋转。
第三人称跟随系统设置定义了相机相对于目标的位置和距离。通过适当的肩膀偏移设置,这个系统可以产生第三人称摄像机效果,其中角色在画面中有一定偏移,并且相机俯视角色的肩膀。通过不同的设置,它还可以产生第一人称摄像机效果。
- Damping 阻尼系数,指摄像机向x,y,z轴三个方向移动反应速度,系数越小反应越快,系数越大反应越慢。官方用rigid和squishier(硬/黏糊柔软)来形容。
Rig
- Shoulder Offset 相对于跟随目标原点的肩膀支点的位置。这个偏移量位于目标模型空间。
- Vertical Arm Length 手相对于肩膀的垂直偏移量。当相机垂直旋转时,arm长度会影响跟踪目标在屏幕空间的偏移。
- Camera Side 明确哪个位置是相机的肩膀(0-1,代表left,in-between,right三种状态)
- Camera Distance 轴点D(相机)距轴点C(手)的距离
Obtacles :内置相机碰撞解决相关参数
第三人称跟随组件具有内置的碰撞解决系统,因此当目标靠近障碍物时,摄像机位置会进行调整,以确保它永远不会位于障碍物内部;内置的碰撞解决意味着无论有多少障碍物,摄像机始终能够将目标保持在视野中。
- Camera Collision Fiter 相机碰撞过滤器,相机会自动避免阻碍这些layer。
- Ignore Tag 检测忽略的Tag
- Camera Radius 虚拟相机会尽量与遮挡物保持不低于这个距离。如果你看到由于较大的FOV导致相机穿透了遮挡物内部,可以适当增加这个值。
- Damping Into/From Collision 镜头因躲避障碍调整位置的阻尼系数
2.2.1.3 Framing Transposer
这节可以参考b站这个up的视频,下面的参数解释都很通俗易懂:
- Unity相机管理:虚拟相机旋转Composer属性详解【Unity Cinemachine】
- 俯视角控制器完善:虚拟相机跟随Framing Transposer 详解【Unity Cinemachine】
选中这个算法时,Cinemachine会在屏幕空间将相机和跟随物体保持固定的相对位置关系。只会改变相机的位置,不会改变相机的旋转。还可以设置偏移、阻尼、构图规则等等。
Framing Transposer算法是为2D和正交相机设计的,主要用于这种情况。但是对于透视相机和3D环境也可以使用。
这个算法工作流程大概是:首先沿着相机的Z轴移动相机直到设定的Camera Distance的XY平面上,然后在XY面上平移,直到目标物体在屏幕空间到达期望的位置。 特别注意:使用Framing Transposer时,会忽略LookAt 目标。
也就是说,当我们的屏幕和 follow对象之间的关系相对固定的时候,我们一般就会采用这里的 Framing Transposer。所以呢,它通常被用在2D游戏以及正交相机当中。比如我们新建一个 cinemachine中的2D相机,我们会发现它其实就是一个使用了 Framing Transposer的虚拟相机。
Framing Transposer参数详解
- Tracked Object Offset:调整虚拟摄像机与“跟随”目标的偏移量。
- Lookahead Time:根据目标的运动,调整虚拟摄像机与“跟随”目标的偏移量。Cinemachine预测目标在在未来数秒之内到达的位置(0~1.000秒)。这个功能对微动的动画敏感,并且会放大噪点,导致非预期的相机抖动。如果目标运动时相机抖动不可接受,降低此属性可能会使目标动画更流畅。
- Lookahead Smoothing:预测算法的平滑度。较大的值可以消除抖动预测但会使预测滞后。
- Lookahead Ignore Y:如果选中,在预测计算时会忽略沿Y轴的移动。
- X/Y/Z Damping:相机尝试保持x/y/z轴偏移的阻尼系数。较小的数字会使相机反应更快。较大的数字会使相机的反应速度变慢。每个轴使用不同的设置可以制造出各种类型相机的行为。
- Target Movement Only:如果启用该选项,则阻尼仅适用于目标的运动。相机旋转变化则无阻尼效果。
- Center On Active:选中时,虚拟相机激活时会将镜头中心对准物体。不选中时,虚拟相机会将目标物体放置在最近的dead zone边缘。
二维参数
- Screen X/Y:目标的水平/垂直屏幕位置。相机移动的结果是使目标处于此位置。
- Soft Zone Width/Height:当目标处于此范围内时,会水平/垂直移动相机,将目标移回到Dead Zone中。Damping属性会影响摄像机的运动速度。
- Bias X/Y:Soft Zone的中心与目标位置的水平/竖直偏移。
- Dead Zone Width/Height:当目标在此位置范围内时,不会水平/垂直移动相机。
- Unlimited Soft Zone:如果选中,Soft Zone没有边界
三维参数
- Camera Distance:沿摄像机轴与跟随目标保持的距离。
- Dead Zone Depth:当相机在z轴上与目标距离小于这个值,就不需要调整相机在z轴上的位置。(相当于二维死区扩充到3维中)
可以看到,z轴方向距离小于dead zone depth时,相机在z轴并不移动(不过负距离依旧会跟随)
至于参数为什么取这些范围,比如damping取0-20,dead zone width/height取0-2,bias取-0.5-0.5,screen x/y取-0.5-1.5,damping和dead zone为啥有关联,这些问题目前没找到参考,以后有缘再研究。
2.2.1.4 Hard Lock to Target
Unity相机保持和目标位置一致。换句话说,目标充当虚拟相机的固定点。
2.2.1.5 Transposer
参考:Unity相机管理:相机跟随之Transposer属性详解【Unity Cinemachine】
tranposer 的意思是虚拟相机将在某个固定的偏移或距离上跟随自标移动,这个固定的偏移就是下面的follow offset。
默认offset值是(0, 0, -10),也就是虚拟相机将在跟随的过程中尽量处于相对于follow目标身后10米的位置(damping延缓效果)。至于这个所谓的身后10米,指的是follow目标本地坐标系的身后10米,还是世界坐标系下的身后10米,则要看下面的binding mode参数。
Binding Mode绑定模式:从目标确定相机位置时使用的坐标空间。
涉及两个知识点:
- local space与global space 本地坐标系轴和世界坐标系轴
- Pitch Axis,Roll Axis,Yaw Axis三种旋转轴
Roll Axis:翻转轴
Yaw Axis:航向轴
Binding Mode 详解:
- Lock To Target On Assign:
它表示虚拟相机会锁定自己和目标之间的距离,锁定发生在这个虚拟相机和follow的对象建立关系的时候即assign,此时虚拟相机会出现在目标本地坐标系下的offset位置。
on assign指的又是什么时候呢?在非游戏状态下只要follow这里有对象,那就一直是所谓的on asssign状态。
游戏状态下,只有给follow 赋值或激活相机,才是on assign状态,此后他们之间的位置关系就锁定了,对象的旋转等操作并不影响相机位置。
- Lock To Target With World Up:锁定与对象的距离,并能绕对象的世界坐标系Y轴旋转相机
- Lock To Target No Roll:锁定与对象的距离,并能绕对象的本地坐标系Y轴旋转相机
- Lock To Target:本地空间,锁定到目标物体
- World Space:offset方位相对于对象的世界坐标系,且相机不会绕轴旋转
- Simple Follow With World Up:相机不会绕对象的任何一个轴旋转,且尽量不会在横向移动,也就是尽量不会沿着x轴的方向做移动
对比下绕本地坐标系轴旋转和对象世界坐标系轴旋转的区别:
2.2.1.6 Orbital Transposer
参考:Unity中如何为俯视角色控制器制作相机行为并让角色相对于相机移动【Cinemachine之Orbital Transposer】
我们知道body属性是用来控制相机的移动的,那么这个orbital transposer,就会限制相机在这个红色圆环上移动。
参数详解:
-
Follow offset 决定了红圈的相关属性,y表示了这个红色圆环相对于追踪目标的高度,z表示了红色圆环的半径,x则表示相机在这个圆环的切线上的偏移。
-
Binding Mode:决定offset所参考的坐标空间以及是否考虑对象三个旋转轴,与Transposer算法相同(参看上一小节)
-
Recenter To Target Heading:接收不到用户输入时,自动归位。
- Enable:是否启用
- Wait Time:等待延迟时间,用户无输入后多长时间重新自动归位。
- Recentering Time:重新自动归位过程花费的时间
-
Heading:
-
Bias:相机围绕轨道旋转的偏移(0为正后方,±180为正前方)
-
Definition:有四个参数Position Delta、Velocity、Target Forward、World Forward。官方定义如下:Choose Position Delta to calculate heading based on the difference in the position of the target from the last update and the current frame. Choose Velocity to use the velocity of the Rigidbody of the target. If the target has no Rigidbody component, reverts to Position Delta. Choose Target Forward to use the target’s local Forward axis as the heading. Choose World Forward to use a constant world-space Forward as heading.
很难理解,根据我的实验,这里heading不能理解为相机的旋转朝向,因为这是Aim参数决定的,Body一定是确定position的参数。上面binding mode和offset是确定圆环的大小、方位和相机在圆环切线偏移的属性,这里heading参数我理解是确定相机在圆环的具体位置,翻译成朝向的话就是指朝向follow对象的什么位置,或者叫航向?Position Delta和Velocity是通过对象位移和速度决定相机最终停留位置,Target Forward是让相机处于follow对象本地坐标轴正后方(Bia为0时),World Forward是让相机处于follow对象世界坐标轴正后方(Bia为0时)。但注意,当binding mode为Lock to Target(包括on assign、no roll with world up),heading选World Forward效果和Target Forward是一样的,我不知道这是官方的bug还是就是这么设置的,还是我理解还不到位。下面分别解释(注:下列加了aim属性更新相机的rotation方便game窗口追踪follow对象)
- Position Delta和Velocity类似,通过follow对象位移或速度确定相机最终归位。bias为0时,相机始终处于follow对象移动方向的后方。
其中Velocity filter strength目的就是通过设置速度采样窗口大小,来筛选掉一些不规则的扰动,让相机的移动更加的平滑。如下图可以看到,filter strength为0时,相机对follow对象微动反应依旧灵敏;filter strength为10时,相机对follow对象微动反应不灵敏。
- Target Forward / World Forward 会让相机保持在轨道的「follow对象本地 / 世界坐标轴后方(-z轴)」(bias为0时)
- Position Delta和Velocity类似,通过follow对象位移或速度确定相机最终归位。bias为0时,相机始终处于follow对象移动方向的后方。
-
-
X Axis: 相机在轨道位置控制。此处的设置控制摄像机响应玩家输入的行为。具体控制诸如相机在圆环上的范围(range),相机在圆环上移动速度/加速度等。
2.2.1.7 Tracked Dolly
这个算法可以让相机沿预定路径移动。使用Path Position属性来指定将虚拟相机放置在路径上的位
置。使用Auto-Dolly模式可将虚拟相机移动到路径上最接近Follow目标的位置。
-
Path:相机移动的路径。此属性必须引用CinemachinePath或Cinemachine Smooth Path对象。
-
Path Position:沿路径放置相机的位置。直接给这个属性作动画或启用Auto-Dolly。这个值以Position Units指定的单位为单位。
-
Position Units:路径位置的度量单位。
- Path Units: 沿路径使用路径点。0表示路径上的第一个路径点,1表示第二个路径点,依此类推。
- Distance: 沿路径使用距离。根据路径的Resolution属性对路径进行采样。Cinemachine创建一个距离查找表,并将其存储在内部缓存中。
- Normalized: 使用路径的开头和结尾。值0表示路径的起点,值1表示路径的终点。
-
Path Offset: 相机相对于路径的位置。X 垂直于路径,Y 向上,Z 平行于路径。使用此属性可使相机偏离路径本身
-
X ,Y,Z Damping: 相机尝试保持 x ,y,z轴偏移的响应程度。小数字使相机更灵敏。数字越大,相机响应越慢。每个轴使用不同的设置可以产生广泛的相机行为。
-
Camera Up: 如何为虚拟摄像机设置向上矢量。这会影响屏幕构图,因为相机 Aim 算法尝试尊重向上方向。
- Default 不修改虚拟相机的向上方向,而是使用Cinemachine Brain中的World Up Override属性。
- Path 在当前点使用路径的向上方向。
- Path No Roll 在当前点使用路径的向上方向,但Roll设置为零。
- Follow Target 使用Follow目标的向上向量。
- Follow Target No Roll 使用Follow目标的变换中的向上向量,但Roll为零。
-
Auto Dolly: 控制自动轨道位置选择方式。要使用此功能,必须设置Follow目标。
Path
Cinemachine中有两种Dolly Path组件:
- CinemachinePath组件:每个路径点都可以设置位置、切线和翻转角度,可以最大程度控制路径。但是如果切线设置的不合理,相机在路径上运动时可能会有不稳定的现象。
- CinemachineSmoothPath组件:每个路径点都可以设置位置和翻转角度。组件中会使用Bezier算法来推算路径点之间的位置。虽然SmoothPath不能完全控制路径,但是整个路径会更平滑和连续。推荐优先使用。可以避免出现尽管路径位置始终是平滑连续的,但沿路径设置动画时仍然可能会产生不稳定的现象。
效果:
2.2.2 Aim
CinemachineVitualCamera组件中的Anim属性用于设置相机旋转时使用什么算法。需要先设置Look At属性。
Aim包含以下旋转算法:
- Do Nothing: 不控制相机的旋转。
- Composer: 保持目标物体在镜头内
- Group Composer: 保持多个目标在镜头内
- Hard Look At: 保持目标在镜头的中心
- POV: 基于玩家的输入旋转相机
- Same As Follow Target: 相机的旋转和目标的旋转保持同步
POV比较有意思,参数都很好懂,这个相机视角非常适合3D自由视角游戏游戏
Recenter Target 参数说一下(选POV时其实也能不选look at,但会影响归位rencentering)
- None 相机归位时朝向世界坐标轴forward轴
- Follow Target Forward :相机归位时朝向与follow对象本地坐标系forward轴一致(无follow对象效果同None)
- Look At Target Forward :相机归位时朝向与look at对象本地坐标系forward轴一致(无look at对象效果同None)
2.2.3 Noise
使用Noise属性可以模拟相机的晃动。Cinemachine中在带了一个Basic Multi Channel Perlin算法,可
以给虚拟相机的运动添加柏林噪声。柏林噪音是一种随机算法技术,可以给相机添加比较自然的随机运
动。
2.2.4 extension简览
详情参考:Extensions章节
Cinemachine的虚拟相机可以添加很多扩展,通过扩展来获得更强的能力。比如Collider扩展可以让相机被其他物体遮挡时,自动避开遮挡的物体。
Cinemachine内置了几种扩展,你也可以通过继承 CinemachineExtension 类来实现你自己的扩展。
-
CustomLockCameraY : Cinemachine虚拟相机的附加模块,用于锁定摄影机的Y坐标
-
CinemachineFadeOutNearbyObjects : 一个用于控制淡出着色器的Cinemachine Virtual Camera示例附加模块
-
CinemachineCameraOffset :可为摄像机添加最终偏移量
-
CinemachineRecomposer :可对摄像机组成进行最终调整。 它旨在用于时间轴上下文,您希望在其中手动调整程序或记录的相机瞄准的输出。
-
Cinemachine3rdPersonAim :强制 LookAt 指向屏幕中心,消除噪音和其他校正。 这对于需要始终精确瞄准的第三人称风格瞄准相机非常有用,即使存在位置或旋转噪声也是如此。
-
CinemachineCollider :用于对虚拟摄像机的最终位置进行后处理。 根据提供的设置,碰撞器将尝试通过远离会阻碍视线的物体来保持与虚拟相机的 LookAt 目标的视线。该项可以利用在很多游戏场景。
碰撞器使用物理射线投射器。因此,Cinemachine Collider 要求潜在障碍物具有碰撞体体积。 此要求存在性能成本。 如果此成本在您的游戏中过高,请考虑以不同方式实现此功能
-
CinemachineConfiner :这个扩展可以将相机的最终位置限定在一个区域内。Confier可以在2D或3D模式下运行。Mode属性影响其接受的边界形状的种类。在3D模式下,是一个空间的范围,需要考虑深度;在2D模式下,是一个平面的范围,不必考虑深度。
-
CinemachineConfiner2D :使用Cinemachine Confiner 2D扩展来限制相机的位置,以便屏幕边缘保持在2D多边形定义的形状内。这适用于正交或透视摄影机,前提是摄影机的前向向量保持平行于边界形状的法线(即摄影机正朝多边形看,而不是斜朝多边形看)。
-
CinemachineFollowZoom :调整相机的FOV来保持物体在屏幕上的尺寸。
-
CinemachineStoryboard :在屏幕上显示一张图片。
-
CinemachineImpulseListener :当你给一个虚拟相机添加Impulse Listener扩展时,这个虚拟相机就能对震动做出反应,最直观的就是相机晃动。 该组件需要配合Cinemachine Impulse Listener脚本组件一起使用,可以很快的得出物体振动引发的相机颤抖特效。
-
CinemachinePostProcessing:使用Cinemachine后处理扩展将后处理V2配置文件连接到虚拟相机。
2.3 Cinemachine Brain
参考:Unity相机管理:Cinemachine Brain属性详解
添加任意虚拟相机后,main camera会多出一个Cinemachine Brain组件(注意main camera的transform等属性此时无法被手动修改,将由Cinemachine Brain读取场景中虚拟相机的配置,并以此配置来控制真实相机的行为)
Cinemachine Brain是UnityCamera上的一个组件,相当于"大脑",可以在每一帧来监控并计算场景中所有活动的Virtual Cameras的状态(位置,方向等),同步选择其他具有相同优先级的Virtual Cameras中或切换具有更高优先级的Virtual Camera甚至进行Virtual Cameras之间的混合(切换)。Virtual Cameras的优先级可以通过手动提前配置或者编写游戏逻辑来进行操控。
2.3.1 Cinemachine Brain 参数详解
-
Live Camera 当前激活的虚拟相机(真实相机使用此虚拟相机的配置控制相机的行为)
-
Live Blend game play状态下,显示相机切换状态
-
Show Debug Text game窗口显示所使用的相机名称和相机切换状态
-
Show Camera Frustum 默认相机只有选中相机对象,才会显示相机视锥体,但如果勾选“Show Camera Frustum” 无论选中什么对象,都能显示live 相机的视锥体。
-
Ignore time scale:表示相机的行为是否受时间缩放值的影响
-
World Up Override:用拖入的游戏对象的y轴来代替相机重置时所用的默认世界坐标系下的y轴
相机在运镜的时候会有一个“上方”的概念,默认情况下这个“上方”就是世界坐标系下的“上”,也就是世界坐标系下y轴的方向。这个“上方”的概念是干什么用的呢,在相机发生旋转的时候如果相机本地坐标下的y轴,和世界坐标下的y轴之间的夹角大于90度时,相机会重设自己的方向,让本地的y轴和世界坐标系y轴之间的夹角小于90度(如果夹角大于九十度会出现上下颠倒的画面所以要始终保持小于90度的逻辑)。
有时候我们不希望这种视角的自动调整,按照unity给出的说法,在俯视角游戏中这种情况最为明显,那么我们就可以在这里放置一个游戏对象,使用这个游戏对象的y轴来代替相机默认的“上方”,也就是用这个游戏对象的y轴来代替世界坐标系下的y轴。
-
Update Method :指的是何时更新虚拟相机的位置和旋转。
fixed update
就是虚拟相机行为与物理引擎同步;late update
就是虚拟相机行为与画面绘制同步;smart update
就是 unity 会根据实际情况,帮我们选择如何进行同步;manual update
就是我们自己编写代码,控制相机的行为的同步时间。推荐默认选择SmartUpdate。 -
Blend Update Method :两个虚拟相机的切换行为与什么同步。这里只有与物理引擎同步(
Fixed Update
)和与画面绘制同步(Late Update
)。 -
Default Blend :虚拟相机之间的切换模式,可以选择慢速切出切入(Ease In Out)、快速切入(Hard In)、匀速切换(Linear)等
-
Custom Blends :建立资源文件,为不同相机间定义不同切换方式
-
Camera Cut Event 在这个列表上的事件只要当前场景任何一个虚拟相机激活并且没有混合时就会触发
-
Camera Activated Event 这个列表上的时间只要任何一个虚拟相机激活。如果涉及混合,则事件将在混合的第一帧上触发
三 总结
本篇用了很长的篇幅学习了cinemachine的基础知识,详细了解了虚拟相机的各个参数,包括body、aim、cinemachine brain等,着重学习了相机移动和旋转的各种算法(Do nothing、3rd Person Follow、Framing Transposer、Hard Lock To Target、Orbital Transposer、Tracked Dolly、Transposer),也了解了一些其他知识点如Binding Mode中的roll yaw pitch等。利用现在所学的知识,已经能够很方便地实现第一/第三人称视角、2d相机跟随、3d自由视角等各种相机操作。
下一步将继续学习多相机系统,以及相机切换等行为,结合官方案例学习如何在不同游戏场景利用cinemachine这个强大的插件。
四 感想
-
对比官方手册和大佬们的博客视频,我发现官方手册有很多解释不够清晰的地方,但如果有前辈深刻体会后,简单一解释就很好理解了。(官方手册太拉,解释不到位不说,还不全。而且还有卖弄嫌疑,遣词造句不够通俗易懂,生怕别人理解了的感觉。。。)
-
所以后续学习要注意找前辈们的视频和博客,真的很能节省时间抓住精髓。其实前辈与前辈之间还是有差距的,大佬总能用自己的理解抓住事物的本质,几句话讲透。而有些前辈只能人云亦云,充当个翻译,不求甚解,我要以此为戒。
-
学习一个章节第一步先看要学什么东西,确定哪些是重点,然后搜集已有博客、视频、官网手册,确定笔记整体思路和大纲,每一要点依旧按照先面后点的思想,先确定某个知识点是干什么的,然后才深入学习具体知识。
具体知识点的渐进学习有几个层次,第一层熟悉这是什么,以及怎么用;第二层为什么这么用,什么原理;第三层就是如何更好地运用,有什么技巧、经验等。