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 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)处逐渐消失。
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),你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。
Cinemachine教程 | Unity中如何快速制作镜头晃动?相关推荐
- Cinemachine教程 | Unity中如何快速制作相机切换动画?
摘要:使用Cinemachine可以快速制作相机切换动画,来看看我是怎么做的吧. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦. 好久不见.我最近 ...
- Cinemachine教程 | Unity中如何制作路径动画?
摘要:在Unity中制作路径动画是有挺多方式的,基于Cinemachine的Dolly Path是一个简单便捷的方法,咱们来快速的学习一下吧! 洪流学堂,让你快人几步.你好,我是跟着大智(VX: zh ...
- Unity使用Shader快速制作一个圆形遮罩
Unity使用Shader快速制作一个圆形遮罩 如何用Shader来做出圆形.切倒角和边缘虚化 Unity使用Shader快速制作一个圆形遮罩 橙子前言 一.创建Shader 二.创建Material ...
- Unity中ugui如何制作不规则按键的两种方法
Unity中ugui如何制作不规则按键的两种方法 两种不同的方案 目前,关于这个问题如何,解决通过搜索引擎我们能找到两种不同的方案: 多边形碰撞器: 该方法是指给精灵(Sprite)添加一个多边形碰撞 ...
- unity editor android 黑屏_如何在Unity中利用nReal制作AR应用
来源:新浪VR nReal眼镜是今年最有趣的增强现实小工具之一.它们已经在CES上展示过了,几个月前笔者在北京亲自试用过,在我的评测中,我强调了它们不仅非常轻.时尚,而且还能提供非常明亮的全息视图. ...
- 个人技术总结——Unity中角色动画制作及动画切换逻辑的实现
这个作业属于哪个课程 软件工程实践2022春-F班 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 课程回顾与总结+个人技术总结 其他参考文献 <Unity2018教 ...
- 在Unity中简单地制作一张2D地图并随机生成资源
这个作业属于哪个课程 软件工程2022年春-F班 这个作业要求在哪里 软件工程实践总结&个人技术博客 这个作业的目标 课程回顾.个人技术总结 其他参考文献 <构建之法> 目录 一. ...
- word实例教程:用表格快速制作座次表
作为一名班主任老师,由于班级学生的座位每个学期或每个月需要换动,这时候,老师就需要手工制作座次表. 作为一名办公室文员,企业内部常常会不定期举行一些会议,通常会需要制作参会人员座位表. 如果人数较少或 ...
- 中流程图快速制作_GitMind教程 | 业务流程图怎么做?
流程图是表示算法.工作流或流程的一种框图表示,它以不同类型的框代表不同种类的步骤,每两个步骤之间则以箭头连接.这种表示方法便于说明解决已知问题的方法.流程图在分析.设计.记录及操控许多领域的流程或程序 ...
最新文章
- 性能优化工具 MVC Mini Profiler
- oracle acfs 快照,20C 新特性 ORACLE ACFS 基于文件的快照
- 网络负载均衡相关技术-服务器负载
- jQuery使用(十二):工具方法之type()之类型判断
- 深入浅出设计模式原则之依赖倒置原则
- myeclipse springboot 运行内存溢出_springboot学习心得 - aowumao
- C++ 空间配置器(allocator)
- 数据库阻塞---讲解设计应用程序时避免阻塞的八个准则
- Spring Framework 4.2 中的新功能和增强功能
- 三菱FX3S,FX3G,FX3U序列PLC控制器编程手册-基本应用指令篇下载
- Windows 95, 98, Me 的界面对比(图集)(原文于2016-03-26发布于贴吧)
- 抄书——最优化的理论与方法(5)——数学基础(凸集和凸函数)
- 网址导航7654推广
- 农业银行代销基金一览表
- 计算机网页设计实习报告怎么写,网页设计实习报告.docx
- b是python文件二进制打开,Python核心编程16 ----- 文件的打开(读取),修改,关闭,二进制...
- 成都拓嘉辰丰:拼多多关键词搜不到自家商品怎么回事?
- vue2+electron 给大家说个相声
- 使用ADB和Python实现手机自动刷视频(快手极速版、抖音极速版)
- 汇编语言里 eax, ebx, ecx, edx, esi, edi, ebp, esp这些都是什么意思啊? [
热门文章
- Linux数据库1366错误,ERROR 1366 (HY000): Incorrect string value:’XXX’ for column 'XXX at row 1解决...
- python绘制折线图先对数据进行处理_python气象数据分析并绘制折线图-女性时尚流行美容健康娱乐mv-ida网...
- UI图标设计素材|风格多样的图标
- 刚入行的UI设计师,通过临摹优秀UI KIT作品开始
- java socket 回调函数_请问Java网络编程如何在不使用多线程的情况下实现异步返回?...
- java 异常返回json_Spring MVC全局异常后返回JSON异常数据
- C++ Socket通信类的封装(还有点小bug)
- C++控制台简单的用户登录
- libvirt Installation
- 内核页表隔离(Kernel page-table isolation,KPTI,简称PTI,旧称KAISER)