类对马岛之魂 落叶交互
本文内容主要是在UE中优化《33号远征队》游戏环境中玩家与地面花瓣的慢速交互的效果,并尝试实现对马岛之魂/燕云十六声等游戏中的刀剑掀起落叶快速交互的效果。
前置工作
物理力分解分析:
剑刃轨迹引发的落叶飞舞效果,叶子粒子会受到多种物理力的综合作用。以下是详细的力分解:
重力 | -50~-500 | 持续 | Gravity Force |
剑刃冲击力 | 500~1500 | 瞬时(0.1~0.3s) | Point Force/Add Impulse |
升力 | 50~300 | 瞬时(0.2~0.5s) | Calculate Lift |
涡旋力 | 200~500 | 持续(跟随剑刃) | Vortex Force |
空气阻力 | 0.1~0.3 | 持续 | Drag Coefficient |
重力(Gravity)
可微调至-50,-500等,调整重力强度会偏离真实物理,但在游戏开发中,需要在物理真实性和艺术表现力之间做权衡:
1)美学方面,类似《对马岛之魂》的"战鬼模式",需要延长落叶飘落时间以增强戏剧感。电影级镜头需要让粒子在画面中停留更久。
2)性能优化方面,较低速度可减少碰撞计算频率(粒子不会快速飞出视野)真实物理中,落叶缓慢下落主要靠空气阻力平衡重力,而非直接修改重力,但UE中,出于实时渲染中的局限性,单纯依赖Drag难以实现自然的飘荡(数值敏感易导致粒子停滞),所以TA做法更建议直接控制下落速度,而不去精确模拟流体力学。
剑刃冲击力(Impulse Force)
剑刃挥动时对粒子施加瞬时推力。
可以用 Point Force
模块绑定到剑刃位置,强度 500~1500
,衰减半径 0.5m
升力(Lift Force)
剑刃快速运动时,下方气压差使粒子短暂浮空。(伯努利效应 快速挥剑产生的低压区)
涡旋力(Vortex/Tornado Force)
模拟剑刃划过的空气涡流,使粒子螺旋运动。
空气动力学阻力(Aerodynamic Drag) (WindForce 风力开启后连带开启的模块)
减缓粒子速度,模拟空气摩擦。
典型值:0.1~0.3
(落叶较轻,阻力较大)
省略对地面反弹力(Particle Collision模块自带)以及邻近粒子排斥力的分析
Niagara模块解析:
Aerodynamic drag模块的解释:
应用非物理的空气动力学阻力,这对于纸张或树叶等薄物体非常有用,因为粒子的网格方向会影响粒子的阻力、升力方向和旋转。
累积为平流速度 (AdvectionVelocity)、物理阻力 (PhysicsDrag) 和瞬态物理旋转阻力 (Transient.PhysicsRotationalDrag),分别应用于“解算力和速度”和“解算旋转力和速度”。
此模式在“解算力和速度”模块中启用旋转解算器
添加Wind Force模块需要连带添加Aerodynamic drag模块和Align Sprite to Mesh Orientation模块。
出于Wind Force的整体性而非局部性,添加后暂时uncheck了这个模块。
制作过程
预设参数:
关卡蓝图:
Niagara设置:
粒子需要改成CPU粒子,并且在编辑器细节中启用阴影。
其它设置概要如图中comment
效果:
结果复盘
适用性和效果评价:
以上步骤即可完成视觉上正确的互动效果,比起对马岛之魂,更适合33号远征队中,角色踩到花瓣上,应该造成的轻微飘散。因此,此系统保留。
Bug和问题:
1)WindForce没有快捷添加region mask的方法,需要禁用,否则会整体飘逸。
2)快速冲击力的效果不好,目前可能是Event Tick帧率的影响,只有慢速移动效果较好,快速移动会跳帧反而导致花瓣没有影响。
快速移动时花瓣无响应的核心问题通常是 事件检测的帧率依赖性与物理更新不同步 导致的。具体原因可能包括:
Tick事件遗漏:
剑刃快速移动时,
Event Tick
的帧率(如30FPS)可能无法捕捉到每一帧的碰撞事件,导致粒子未被触发。碰撞检测精度不足:
默认的碰撞检测(如
Sphere Trace
)在高速移动时可能出现“隧道效应”(Tunneling),物体从碰撞体中间穿过而未触发。力作用时间过短:
快速挥剑时,冲击力作用时间(如0.1秒)可能小于粒子系统的响应延迟。
参考教程及对教程的feedback:
1)CGHOW的教程效果不真实。他是用反向point attraction force,region mask结合Attractor Position Offset。在物理上应该是错误的。
2)Kerry老师在Unity VFX Graph做出来效果非常合理。但是如果需要在UE里做,Unity案例的实现方法和Niagara的实现机制会有较大差异,包括Unity中debug shader等方便的工具在Niagara里需要换一套实现pipeline。
待更新内容:
为了达成快速剑气冲击的效果,需要替换事件检测方式
改进方案:方案一:连续碰撞检测(CCD) 强制物理引擎在高速移动时进行子帧插值计算。
方案二:轨迹采样(Sweep Traces)对剑刃移动轨迹进行连续射线检测,补帧间遗漏。
(CCD成本较高,优先尝试轨迹采样)。
// 每帧存储剑刃上一帧位置
LastSocketLocation = SwordMesh.GetSocketLocation("Tip");// 当前帧位置
CurrentSocketLocation = SwordMesh.GetSocketLocation("Tip");// 计算移动方向并发射射线
Direction = CurrentSocketLocation - LastSocketLocation;
HitResult = LineTraceByChannel(LastSocketLocation, CurrentSocketLocation, CollisionChannel);// 命中时触发粒子
if (HitResult.bBlockingHit) {NiagaraSystem.SpawnAtLocation(HitResult.Location);
}
并计划更新Unity VFX Graph的实现 与 UE Niagara实现的工作流对比。