Skip to content

fix: unwrap Filter shell in PostProcess2D.addEffect to avoid effectInit crash(PostProcess2D.addEffect 兼容直接传入 Filter 外壳,自动解包避免 effectInit 报错) - #2335

Open
xiaosong1985 wants to merge 1 commit into
layabox:LayaAir_3.4Tempfrom
xiaosong1985:fix/postprocess2d-addeffect-filter

Conversation

@xiaosong1985

Copy link
Copy Markdown
Contributor

问题

开发者反馈:直接调用 PostProcess2D.addEffect(filter)postProcess.effects = [filter] 时报错 TypeError: effect.effectInit is not a function

原因

LayaAir 3.4 中 ColorFilter / GlowFilter / BlurFilter 只是 Filter 外壳,真正的 PostProcess2DEffect 需要通过 filter.getEffect() 取出(内部 _effect2D)。Filter 基类没有 effectInit / destroyed / singletonPostProcess2DEffect 成员。h5game 旧代码直接把 Filter 塞进 postProcess.effects / addEffect,到 3.4 就会在 addEffect 内部调用 effect.effectInit(this) 时抛异常。effects setter 内部也逐个走 addEffect,同样中招。

修复

PostProcess2D.addEffect 入口做一次兼容解包:入参是 Filter 时自动取 getEffect()addEffect 是唯一收敛点,effects setter 一并覆盖;Sprite.filters 本就传 getEffect() 的正确路径,instanceof Filter 为 false 原样通过,幂等无副作用。

addEffect<T extends PostProcess2DEffect>(effect: T): T | null {
   if (effect instanceof Filter) {
      effect = effect.getEffect() as unknown as T;
   }
   ...
}

验证

在基于 3.4 引擎的 WxWebGPU 工程中复现并验证:

  • 修复前:addEffect(filter)effects=[filter] 两条路径均抛 effect.effectInit is not a function
  • 修复后:两条路径均正常,且去饱和的 ColorFilter 真正生效(测试色块变灰),说明 effect 被正确解包并进入渲染管线。

仅改动一个文件 src/layaAir/laya/display/PostProcess2D.ts,不涉及子模块。

🤖 Generated with Claude Code

…it crash(PostProcess2D.addEffect 兼容直接传入 ColorFilter/GlowFilter/BlurFilter 等 Filter 外壳,自动解包为真正的 effect,避免调用 effectInit 时报错)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant