Unity探路营

Cinemachine教程 | Unity中如何快速制作镜头晃动

2020-04-27  本文已影响0人  洪智

摘要:经常在游戏、影视中会看到镜头晃动的镜头,比如枪的后坐力、爆炸、碰撞、巨人踩踏地面等等,镜头晃动如何快速制作呢?

洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。

今天小新要给你分享的问题是:

Unity中如何快速制作镜头晃动?

经常在游戏、影视中会看到镜头晃动的镜头,比如枪的后坐力、爆炸、碰撞、巨人踩踏地面等等,镜头晃动如何快速制作呢?

要想解决这个问题,在Cinemachine中是非常简单的,就是使用Impluse相关的功能。

Cinemachine Impulse 相机震动

Cinemachine Impulse可以根据游戏事件产生和管理相机晃动。比如当两个物体发生碰撞、附近发生爆炸时,可以让虚拟相机发生剧烈晃动。

Impulse的本意是脉冲,小新感觉在这翻译为震动更合适。

Impulse由三个部分组成:

Impulse使用流程
1、给场景中的一个或多个物体添加Cinemachine Impulse Source(代码触发)或Cinemachine Collision Impulse Source(碰撞触发)组件,这些物体会作为震动源。

2、给震动源组件上设置震动信号Raw Signal,可以使用内置的Presets,也可以自定义创建。

3、给需要对震动作出反应的虚拟相机添加Cinemachine Impulse Listener组件。

添加Cinemachine Impulse Listener扩展组件

震动源组件

Cinemachine Impulse SourceCinemachine Collision Impulse Source组件都是震动源组件,有啥区别呢?

震动源可以根据代码或碰撞触发震动源产生震动信号。触发震动源后,震动源(所在位置)产生震动信号,然后拥有Impulse Listener扩展的虚拟相机对震动做出反应产生晃动。

如下图中,角色的脚是震动源。当脚与地板(A)发生碰撞时会产生震动。虚拟相机上的Impulse Listener扩展会对震动作出反应,那就是相机的晃动(B),会导致Game窗口中C的结果。

场景中可以根据需要设置多个震动源。下面是一些应用场景的举例:

默认情况下,一个震动源会影响所有范围内的Impulse Listener,但是你可以通过设置channel filtering来进行筛选。

Impulse Source的核心属性

原始震动信号定义了相机晃动的基本“形态”,Impulse Source组件中控制了一些其他重要的属性,影响生成的震动。

理解下面这些属性可以让你做出更真实的相机晃动效果。

主要是下面这些属性:

Amplitude 振幅

组件Raw Signal属性中的振幅控制每次震动的强度。有两种方法可以调整给定震动信号的振幅。

Amplitude Gain属性可以放大或衰减原始震动信号,它会一直影响所有震动。可以将其视为用于调高或调低源震动强度的全局“音量”设置。

通过代码生成信号时更改Velocity矢量的大小也会缩放信号振幅,但影响是单次的,不是全局的。通过调整单个震动事件的Velocity,可以让轻度冲击产生较小的振动,而重度冲击产生较大的振动。

var source = GetComponent<CinemachineImpulseSource>();
source.GenerateImpulse(new Vector3(100, 100, 100));

最终每次碰撞的实际振幅,就是全局参数(信号源,Amplitude Gain属性)和单次调节参数(Velocity)相乘的结果。

Orientation and Direction 朝向和方向

为了产生逼真的振动,震动信号沿冲击轴应最强,其振幅(或强度)应与冲击力成正比。例如,如果你用锤子敲击墙壁,则墙壁主要沿锤子路径的轴线振动。为了使锤子的脉冲信号更真实,它在该轴上应具有最大的振动。

在下图中,振动主轴(A)与锤子撞击墙壁(B)时的行进方向一致。

Impulse不需要为每个可能的冲击方向和强度分别定义信号,而是使用“局部空间”的概念来定义原始信号。你可以在原始信号的本地空间中旋转和缩放原始信号,以生成与实际影响相匹配的“最终”信号。

Impulse默认情况下撞击的方向是“向下”,因此,一般你的信号应沿Y轴施加更多的振动(6D shake noise profile会这样做)。你也可以通过局部空间的旋转和缩放来为每次撞击产生正确的振动方向。

控制朝向和方向

Cinemachine Impulse SourceCinemachine Collision Impulse Source组件中的属性可以控制原始信号的朝向。使用下面这些属性来模拟现实世界的振动。

方向模式

Spatial Range > Direction Mode属性可以对信号方向进行微调。设置为Rotate Towards Source时,脉冲信号会进一步旋转,以使振动指向震动源的方向更加明显。

对于径向对称振动,效果并不明显,但是对于强调方向的信号(如6D震动),它可以暗示振动的来源。当你在多个位置产生影响并且不希望它们都感觉相同时,这可能会非常有效。

Direction Mode的默认设置是Fixed,不会产生特殊效果。

Time envelope 时间包络

真实世界中,冲击产生的振动会先增强强,直到达到峰值强度,然后减弱直到振动停止。这个周期需要多长时间取决于撞击的强度以及所涉及物体的特征。

例如,用锤子敲打混凝土墙会产生短暂而强烈的冲击。振动几乎立即达到其峰值强度,并且几乎立即停止。另一方面,撞击大片薄金属会产生持续的振动,该振动突然开始,停留在峰值强度一段时间,然后逐渐软化。

当场景中的碰撞晃动相机时,使用Impulse Source中的Time Envelope属性控制此循环。Time Envelope具有三个属性:

AttackDecay中包含时长值(指定过渡持续多长时间)和一个曲线(可选,定义它如何发生,例如,是否逐渐地或突然发生)。如果在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耗散距离上如何淡出。

扩展阅读

【扩展学习】洪流学堂公众号回复timeline可以下载Timeline&Cinemachine系列教程全文带目录PDF哦,更有本文的视频教程等着你!


呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

我是大智(欢迎加我微信:zhz11235),你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

上一篇下一篇

猜你喜欢

热点阅读