diff --git a/packages/framework/src/scenes/ReactiveScene.ts b/packages/framework/src/scenes/ReactiveScene.ts index 25abe0a..a96f901 100644 --- a/packages/framework/src/scenes/ReactiveScene.ts +++ b/packages/framework/src/scenes/ReactiveScene.ts @@ -1,4 +1,4 @@ -import { effect, type ReadonlySignal } from "@preact/signals-core"; +import { type ReadonlySignal } from "@preact/signals-core"; import { Scene } from "phaser"; import { DisposableBag, type IDisposable } from "../utils"; @@ -85,6 +85,6 @@ export abstract class ReactiveScene /** 注册响应式监听(场景关闭时自动清理) */ public addEffect(fn: () => CleanupFn): void { - this.disposables.add(effect(fn)); + this.disposables.addEffect(fn); } } diff --git a/packages/framework/src/utils/disposable.ts b/packages/framework/src/utils/disposable.ts index 3dbeb84..db0271f 100644 --- a/packages/framework/src/utils/disposable.ts +++ b/packages/framework/src/utils/disposable.ts @@ -1,3 +1,5 @@ +import { effect } from "@preact/signals-core"; + export interface IDisposable { dispose(): void; } @@ -8,6 +10,10 @@ export class DisposableBag implements IDisposable { private _disposables = new Set(); private _isDisposed = false; + constructor(go?: Phaser.GameObjects.GameObject) { + if (go) go.on("shutdown", () => this.dispose()); + } + get isDisposed(): boolean { return this._isDisposed; } @@ -20,6 +26,10 @@ export class DisposableBag implements IDisposable { this._disposables.add(item); } + addEffect(fn: () => void) { + this.add(effect(fn)); + } + dispose(): void { if (this._isDisposed) return;