Cinemachine教程 | Unity中如何快速制作镜头晃动
摘要:经常在游戏、影视中会看到镜头晃动的镜头,比如枪的后坐力、爆炸、碰撞、巨人踩踏地面等等,镜头晃动如何快速制作呢?
洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。
今天小新要给你分享的问题是:
Unity中如何快速制作镜头晃动?
经常在游戏、影视中会看到镜头晃动的镜头,比如枪的后坐力、爆炸、碰撞、巨人踩踏地面等等,镜头晃动如何快速制作呢?
要想解决这个问题,在Cinemachine中是非常简单的,就是使用Impluse相关的功能。
Cinemachine Impulse 相机震动
Cinemachine Impulse可以根据游戏事件产生和管理相机晃动。比如当两个物体发生碰撞、附近发生爆炸时,可以让虚拟相机发生剧烈晃动。
Impulse的本意是脉冲,小新感觉在这翻译为震动更合适。
Impulse由三个部分组成:
-
Raw vibration signal 原始震动信号。包含6个维度:X, Y, Z, pitch, roll, yaw的震动曲线。这个震动信号很大程度上决定了相机镜头晃动的表现形式。
-
Impulse Source 震动的发生源。定义了震动发生的位置、时长、强度和范围。
-
Impulse Listener Cinemachine的扩展,添加了这个扩展后虚拟相机就能“感受到”震动,并且作出晃动的反应。
Impulse使用流程
1、给场景中的一个或多个物体添加Cinemachine Impulse Source(代码触发)或Cinemachine Collision Impulse Source(碰撞触发)组件,这些物体会作为震动源。
2、给震动源组件上设置震动信号Raw Signal,可以使用内置的Presets,也可以自定义创建。
3、给需要对震动作出反应的虚拟相机添加Cinemachine Impulse Listener组件。
添加Cinemachine Impulse Listener扩展组件震动源组件
Cinemachine Impulse Source和Cinemachine Collision Impulse Source组件都是震动源组件,有啥区别呢?
- Cinemachine Collision Impulse Source 根据碰撞或触发器产生震动信号。
- Cinemachine Impulse Source 根据事件产生震动信号。
震动源可以根据代码或碰撞触发震动源产生震动信号。触发震动源后,震动源(所在位置)产生震动信号,然后拥有Impulse Listener扩展的虚拟相机对震动做出反应产生晃动。
如下图中,角色的脚是震动源。当脚与地板(A)发生碰撞时会产生震动。虚拟相机上的Impulse Listener扩展会对震动作出反应,那就是相机的晃动(B),会导致Game窗口中C的结果。
场景中可以根据需要设置多个震动源。下面是一些应用场景的举例:
- 巨人的脚上设置震动源。巨人走动时可以制造出大地晃动的感觉。
- 在炮弹上设置震动源。炮弹命中目标后爆炸的效果。
默认情况下,一个震动源会影响所有范围内的Impulse Listener,但是你可以通过设置channel filtering来进行筛选。
Impulse Source的核心属性
原始震动信号定义了相机晃动的基本“形态”,Impulse Source组件中控制了一些其他重要的属性,影响生成的震动。
理解下面这些属性可以让你做出更真实的相机晃动效果。
主要是下面这些属性:
- Amplitude 控制震动的振幅。
- Orientation and direction 朝向和方向。震动可以改变信号的方向,保持震动方向的一致。
- Time envelope 控制信号的起音,维持和衰减,以使信号淡入和淡出至适当的强度并具有一定的持续时间。
- Spatial range 空间范围控制信号在场景中完全消失之前在场景中传播的距离。
Amplitude 振幅
组件Raw Signal属性中的振幅控制每次震动的强度。有两种方法可以调整给定震动信号的振幅。
Amplitude Gain属性可以放大或衰减原始震动信号,它会一直影响所有震动。可以将其视为用于调高或调低源震动强度的全局“音量”设置。
通过代码生成信号时更改Velocity矢量的大小也会缩放信号振幅,但影响是单次的,不是全局的。通过调整单个震动事件的Velocity,可以让轻度冲击产生较小的振动,而重度冲击产生较大的振动。
- 对于Cinemachine Impulse Source组件,你必须自己通过脚本设置Velocity。信号的幅度按速度的大小缩放。代码如下:
var source = GetComponent<CinemachineImpulseSource>();
source.GenerateImpulse(new Vector3(100, 100, 100));
- 对于Cinemachine Collision Impulse Source组件自动根据三个属性定义的规则来计算单次的Velocity:Use Impact Direction、Scale Impact With Mass、Scale Impact With Speed。
最终每次碰撞的实际振幅,就是全局参数(信号源,Amplitude Gain属性)和单次调节参数(Velocity)相乘的结果。
Orientation and Direction 朝向和方向
为了产生逼真的振动,震动信号沿冲击轴应最强,其振幅(或强度)应与冲击力成正比。例如,如果你用锤子敲击墙壁,则墙壁主要沿锤子路径的轴线振动。为了使锤子的脉冲信号更真实,它在该轴上应具有最大的振动。
在下图中,振动主轴(A)与锤子撞击墙壁(B)时的行进方向一致。
Impulse不需要为每个可能的冲击方向和强度分别定义信号,而是使用“局部空间”的概念来定义原始信号。你可以在原始信号的本地空间中旋转和缩放原始信号,以生成与实际影响相匹配的“最终”信号。
Impulse默认情况下撞击的方向是“向下”,因此,一般你的信号应沿Y轴施加更多的振动(6D shake noise profile会这样做)。你也可以通过局部空间的旋转和缩放来为每次撞击产生正确的振动方向。
控制朝向和方向
Cinemachine Impulse Source和Cinemachine Collision Impulse Source组件中的属性可以控制原始信号的朝向。使用下面这些属性来模拟现实世界的振动。
-
对于Cinemachine Impulse Source组件,
GenerateImpulse()
方法将速度矢量作为参数。该矢量定义了冲击的方向和强度。Impulse系统使用它根据原始信号定义来计算最终信号,并对其进行适当的旋转和缩放。 -
对于Cinemachine Collision Impulse Source组件,会根据所涉及GameObject的方向和质量自动生成速度矢量。要控制生成结果,使用Inspector中的How To Generate The Impulse中的属性。Use Impact Direction属性控制信号是否被旋转到对应冲击方向。
方向模式
Spatial Range > Direction Mode属性可以对信号方向进行微调。设置为Rotate Towards Source时,脉冲信号会进一步旋转,以使振动指向震动源的方向更加明显。
对于径向对称振动,效果并不明显,但是对于强调方向的信号(如6D震动),它可以暗示振动的来源。当你在多个位置产生影响并且不希望它们都感觉相同时,这可能会非常有效。
Direction Mode的默认设置是Fixed,不会产生特殊效果。
Time envelope 时间包络
真实世界中,冲击产生的振动会先增强强,直到达到峰值强度,然后减弱直到振动停止。这个周期需要多长时间取决于撞击的强度以及所涉及物体的特征。
例如,用锤子敲打混凝土墙会产生短暂而强烈的冲击。振动几乎立即达到其峰值强度,并且几乎立即停止。另一方面,撞击大片薄金属会产生持续的振动,该振动突然开始,停留在峰值强度一段时间,然后逐渐软化。
当场景中的碰撞晃动相机时,使用Impulse Source中的Time Envelope属性控制此循环。Time Envelope具有三个属性:
- Attack控制脉冲信号向峰值强度的过渡。
- Sustain Time指定信号在峰值强度处停留多长时间。
- Decay控制信号从峰值强度到零的过渡。
Attack和Decay中包含时长值(指定过渡持续多长时间)和一个曲线(可选,定义它如何发生,例如,是否逐渐地或突然发生)。如果在Inspector中将曲线留为空白,则Impulse将使用默认曲线,适用于大多数用途。Sustain Time持续时间仅仅是一个持续时间值。
总而言之,这些属性控制着撞击产生的振动持续多长时间,以及它们如何淡入和淡出。但是,它们并不能改变震动强度。可以启用Scale with Impact属性。启用后,时间范围会根据影响的强度进行缩放。较强的影响会使持续时间更长,而较弱的影响会使持续时间更短。这不会影响三个阶段的时长比例。
Spatial Range 空间范围
Impulse Source的Spatial Range属性定义了场景中震动源影响的区域。此区域中的Impulse Listener会对脉冲源做出反应(除非将它们过滤掉),而位于外部的Listener则不会作出反应。
该区域包括两个属性:Impact Radius冲击半径和Dissipation Distance耗散距离。当脉冲源产生脉冲时,振动信号将保持全强度,直到到达冲击半径的末端。然后,其强度在耗散距离上衰减为零。这两个属性共同定义了信号的总范围。
在下图中,从振动点发出到到达冲击半径(A)为止,振动信号一直保持全强度,然后在耗散距离(B)处逐渐消失。
振动信号从其从撞击点发出到到达撞击半径(A)一直保持全强度,然后在耗散距离(B)处逐渐消失。Dissipation Mode耗散模式属性控制信号在Dissipation Distance耗散距离上如何淡出。
-
Exponential Decay指数衰减会产生逐渐消失的衰减,随着逐渐接近耗散距离的末尾,衰减会变慢。
-
Soft Decay软衰减创建的淡出开始缓慢,加快并在接近耗散距离终点时再次减速。
-
Linear Decay线性衰减会在耗散距离上产生均匀的淡出。
扩展阅读
- 【Cinemachine智能相机教程】VirtualCamera(四):Noise属性
- 【Cinemachine智能相机教程】VirtualCamera(三):Aim属性
- 【Cinemachine智能相机教程】VirtualCamera(二):Body属性
- 【Cinemachine】VirtualCamera虚拟相机详解(一)
- 5分钟入门Cinemachine智能相机系统
- Unity编辑器录屏神器:Unity Recorder
- 5分钟制作过场动画
- 【建议收藏】找不到免费的角色动画?来试试mixamo
【扩展学习】在洪流学堂公众号回复
timeline
可以下载Timeline&Cinemachine系列教程全文带目录PDF哦,更有本文的视频教程等着你!
呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。
我是大智(欢迎加我微信:zhz11235),你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。