feat(particle): 添加粒子与 Rapier2D 物理碰撞集成 (#295)

* feat(particle): 添加粒子与 Rapier2D 物理碰撞集成

- 新增 Physics2DCollisionModule 模块,支持粒子与场景碰撞体交互
- 支持圆形重叠检测和射线检测两种模式
- 支持 Kill/Bounce/Stop 三种碰撞行为
- 修复 module.update() 参数顺序 bug
- 物理模块自动通过 context 注入,用户只需添加模块即可

* chore: update pnpm-lock.yaml for particle physics dependency

Update lockfile to include @esengine/physics-rapier2d as optional peer dependency.
This commit is contained in:
YHH
2025-12-08 09:38:37 +08:00
committed by GitHub
parent d92c2a7b66
commit 52bbccd53c
10 changed files with 535 additions and 2 deletions

View File

@@ -7,6 +7,7 @@ import { ColorOverLifetimeModule } from './modules/ColorOverLifetimeModule';
import { SizeOverLifetimeModule } from './modules/SizeOverLifetimeModule';
import { CollisionModule } from './modules/CollisionModule';
import { ForceFieldModule } from './modules/ForceFieldModule';
import { Physics2DCollisionModule } from './modules/Physics2DCollisionModule';
import type { IParticleAsset, IBurstConfig } from './loaders/ParticleLoader';
// Re-export for backward compatibility
@@ -751,7 +752,33 @@ export class ParticleSystemComponent extends Component {
const normalizedAge = p.age / p.lifetime;
for (const module of this._modules) {
if (module.enabled) {
module.update(p, normalizedAge, dt);
module.update(p, dt, normalizedAge);
}
}
}
// 处理碰撞模块标记的需销毁粒子 | Process particles marked for death by collision modules
for (const module of this._modules) {
if (module.enabled) {
// 处理边界碰撞模块 | Handle boundary collision module
if (module instanceof CollisionModule) {
const toKill = module.getParticlesToKill();
for (const p of toKill) {
if (p.alive) {
particlesToRecycle.push(p);
}
}
module.clearDeathFlags();
}
// 处理物理碰撞模块 | Handle physics collision module
if (module instanceof Physics2DCollisionModule) {
const toKill = module.getParticlesToKill();
for (const p of toKill) {
if (p.alive) {
particlesToRecycle.push(p);
}
}
module.clearDeathFlags();
}
}
}