引子:客户要的「子弹时间」,差点让我翻车
去年Q4,我们接了一个汽车品牌的线上发布会项目,客户想要一段「子弹时间」慢动作——车子高速冲过水坑,水花四溅的瞬间时间几乎静止,镜头环绕车身,然后恢复正常速度。听起来很酷对吧?我第一反应是:这不就是UE5的时间膨胀(Time Dilation)嘛,调个全局时间倍率就完事了。结果,这个看似简单的需求,让我在后续两周里踩遍了时间系统的坑,也让我对UE5的时间管理有了全新的理解。今天就把这次项目复盘出来,从需求分析到技术选型,再到踩坑和解决,全程第一人称,希望能帮你绕过我掉过的那些坑。
先交代一下背景:项目用的是UE5.3,渲染管线是Lumen + Nanite,输出4K 60帧的过场动画,最终要合成到直播流里。团队里有两个刚入行的灯光师和一个动画师,他们对蓝图略懂,但对时间系统几乎没概念。我的任务就是设计一套稳定、可调、美术友好的慢动作方案,并且保证在Sequencer里能精确控制。

需求拆解:不是所有慢动作都叫Time Dilation
客户描述的「子弹时间」其实包含三个层次的时间变化:
- 全局时间缩放:整个场景的时间流速降低,比如0.05倍速,让水花、尘土、车身的运动都变慢。
- 局部时间冻结:镜头环绕时,某些物体(比如飞溅的水滴)需要几乎静止,而另一些物体(比如背景的云)可以保持正常速度甚至加速。
- 时间恢复曲线:从慢动作回到正常速度不能是线性跳变,需要有缓入缓出的曲线,否则观众会感到突兀。
如果只用Set Global Time Dilation,只能做到第一层,而且会影响所有Actor,包括摄像机、UI和音频。更麻烦的是,Sequencer里的动画曲线也会被全局时间膨胀影响,导致关键帧插值出现不可控的偏差。所以,技术选型时我放弃了「一刀切」的方案,转而采用分层时间控制:全局时间膨胀负责整体氛围,局部时间膨胀(通过Actor的Custom Time Dilation)负责特定物体的精细控制,再用时间膨胀曲线(Time Dilation Curve)来驱动过渡。
为什么不用Tick里的DeltaTime缩放?
很多教程会教你直接改DeltaTime,比如在Tick里乘以一个系数。这看起来简单,但会破坏引擎的物理、动画和音频同步。UE5的时间膨胀是引擎层面统一管理的,它会影响DeltaTime、物理子步进、动画更新频率、音频播放速率,甚至粒子系统的模拟速度。而手动改DeltaTime只是局部欺骗,物理和动画会不同步,最终导致水花和车身运动脱节。所以,我的原则是:能用引擎原生时间系统,就别自己造轮子。
技术方案:三层时间控制架构
最终我们落地的方案分为三层:
- 全局层:通过
Set Global Time Dilation控制整体时间流速,范围0.01~1.0,由Sequencer的Time Dilation Track驱动,方便动画师调曲线。 - 局部层:对关键Actor(车身、水花粒子、轮胎烟雾)设置
Custom Time Dilation,让它们在全局慢动作的基础上进一步减速或加速,实现「相对时间」效果。 - 音频层:音频需要单独处理,因为全局时间膨胀会改变音频播放速率,导致音调变低。我们通过Audio Component的
Set Pitch Multiplier和Set Low Pass Filter Frequency来模拟慢动作的音效,而不是依赖时间膨胀。
这里重点讲局部层,因为它是实现「子弹时间」质感的关键。UE5里每个Actor都有Custom Time Dilation属性,默认是1.0,它是在全局时间膨胀的基础上再乘一个系数。比如全局0.1,某个Actor的Custom Time Dilation设为0.5,那么它的实际时间流速就是0.05。这个机制让我们可以做出「水花几乎冻结,而车身还在缓慢移动」的层次感。

踩坑1:粒子系统的Time Dilation不生效
第一个坑来自Niagara粒子。我们想让水花粒子在慢动作时几乎静止,于是给粒子系统所在的Actor设置了Custom Time Dilation为0.01。结果发现粒子还是正常速度飞溅。查了文档才知道,Niagara的Simulation Target如果选的是System,它默认使用全局时间,不继承Actor的Custom Time Dilation。解决办法是在Niagara System的Properties里勾选Use Custom Time Dilation,或者把Simulation Target改成Component,这样它就会跟随所属Actor的时间膨胀。这个细节官方文档里藏得很深,我是在论坛里翻到的。
踩坑2:Sequencer里的时间膨胀曲线冲突
第二个坑更隐蔽。我们在Sequencer里用Time Dilation Track画了一条从1.0到0.05的曲线,但同时在蓝图里又用Set Global Time Dilation做了另一套逻辑。结果两者互相覆盖,导致慢动作时有时无。后来我们统一了规则:Sequencer负责所有时间膨胀的动画曲线,蓝图只负责触发和重置。具体做法是,在Sequencer里添加一个Time Dilation Track,绑定到Global Time Dilation,然后用Curve Editor编辑缓入缓出。这样动画师可以直观地调整时间曲线,而不需要程序员改代码。
技巧提示:Sequencer的Time Dilation Track默认只影响Sequencer的播放速度,如果要影响全局时间,需要在Track的Properties里勾选Apply to Global Time Dilation。这个选项藏得比较深,但非常关键。
踩坑3:物理模拟在低时间膨胀下的稳定性
第三个坑是物理。当全局时间膨胀降到0.01时,Chaos物理引擎的子步进(Substepping)会变得不稳定,水花刚体出现抖动甚至穿透。原因是物理模拟的Max Substep Delta Time和Max Substeps默认值在极低时间膨胀下不够用。我们的解决方案是在Project Settings > Physics里调高Max Substeps到8,并设置Max Substep Delta Time为0.008,同时启用Substepping。这样物理在慢动作下依然平滑。但要注意,这会增加CPU开销,所以只在慢动作期间动态调整这些参数,正常速度时恢复默认。
交付与反思:时间膨胀不是万能药
最终项目按时交付,客户对「子弹时间」的效果非常满意,尤其是水花在慢动作下呈现出的晶莹质感。但复盘下来,我认为时间膨胀虽然强大,但绝不能滥用。几个关键教训:
- 时间膨胀会影响所有依赖DeltaTime的系统,包括动画蓝图、AI、音频,所以必须逐项检查,不能想当然。
- 局部时间膨胀比全局更可控,但需要手动管理每个Actor的Custom Time Dilation,适合关键物体,不适合大规模场景。
- 音频必须单独处理,不要依赖时间膨胀来变调,否则会失真。
- Sequencer和蓝图要明确分工,避免时间控制逻辑冲突。
另外,我还发现一个有趣的细节:UE5的时间膨胀对Nanite和Lumen的影响很小,因为它们的更新频率与时间膨胀解耦,这算是意外之喜。但如果你用了Virtual Shadow Maps,在极低时间膨胀下可能会出现阴影闪烁,需要手动调整r.Shadow.Virtual.ResolutionLodBias。

这次项目让我重新审视了UE5的时间系统。它远不止一个Set Global Time Dilation节点那么简单,而是一套需要精心设计的架构。如果你也在做类似的需求,希望我的踩坑经历能帮你省下几天时间。
关于火星人教育
我是火星人教育的UE5技术导师,以上复盘来自我们真实的企业级项目。火星人教育创办24年来,一直专注于数字艺术与AIGC实战职业技能培训,课程覆盖AI漫剧创作、AIGC视觉设计、UE5游戏特效、室内全屋定制、MAYA三维动画、C4D动态设计、工业设计、NUKE影视后期、摄影摄像实训等方向。我们在北京、深圳双校区开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,以项目化实训教学,夯实专业技能,助力就业与职业提升。如果你也想系统学习UE5时间系统、Sequencer高级技巧和实时渲染,欢迎咨询:010-65918670。








评论(0)