加入碰撞和粒子发射路径

This commit is contained in:
tianmo committed 2026-09-05 18:18:05 +08:00
1 parent 026ee74d48
commit 72d8daa283
12 files changed
+1365 -1276

No files matched your search

+13 -2
View File
@@ -325,8 +325,9 @@ export interface EmitterConfig {
/** 蒙皮网格拓扑尺寸 */
trailGridRows: number
trailGridCols: number
/** 开启碰撞(预留) */
/** 开启碰撞;仅 collisionColliderIds 中显式选中的场景碰撞体参与计算。 */
collision: boolean
collisionColliderIds: number[]
/** 开启路径跟随(预留) */
pathFollow: boolean
emitterFollow: boolean
@@ -609,6 +610,7 @@ export function defaultConfig(): EmitterConfig {
trailGridRows: 4,
trailGridCols: 4,
collision: false,
collisionColliderIds: [],
pathFollow: false,
emitterFollow: false,
emitterFollowMode: 'none',
@@ -685,6 +687,15 @@ export function ensureEmitterConfig(config: EmitterConfig): EmitterConfig {
config.innerRectH = Math.max(0, Number(config.innerRectH) || 0)
config.outerRectW = Math.max(config.innerRectW, Number(config.outerRectW) || 0)
config.outerRectH = Math.max(config.innerRectH, Number(config.outerRectH) || 0)
const normalizedCollisionColliderIds = Array.from(new Set(
(Array.isArray(config.collisionColliderIds) ? config.collisionColliderIds : [])
.map((id) => Math.round(Number(id)))
.filter((id) => Number.isFinite(id) && id > 0),
))
if (normalizedCollisionColliderIds.length !== config.collisionColliderIds.length
|| normalizedCollisionColliderIds.some((id, index) => id !== config.collisionColliderIds[index])) {
config.collisionColliderIds = normalizedCollisionColliderIds
}
if (config.streamBehavior !== 'normal' && config.streamBehavior !== 'loop') config.streamBehavior = 'normal'
if (needsLoopDurationMigration || !Number.isFinite(config.loopDurationFrames)) config.loopDurationFrames = Math.ceil(Math.max(1 / 30, Number(config.duration) || 1) * 30)
config.loopDurationFrames = Math.min(1800, Math.max(1, Math.ceil(config.loopDurationFrames)))
@@ -1013,7 +1024,7 @@ export class ParticleEmitter extends Container {
}
private applyColliders(p: Particle, particleIndex: number) {
if (!this.colliders.length) return false
if (!this.cfg.collision || !this.colliders.length) return false
const cfg = this.cfg
let world = localToWorldMath(cfg, p.x, p.y, this.simulationTransform)
let velocity = localVelocityToWorldMath(cfg, p.vx, p.vy, this.simulationTransform)