diff --git a/src/framework/asset/asset-reference.js b/src/framework/asset/asset-reference.js index 02ffb124b49..2f21cfe3236 100644 --- a/src/framework/asset/asset-reference.js +++ b/src/framework/asset/asset-reference.js @@ -6,6 +6,48 @@ * @category Asset */ class AssetReference { + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLoadById = null; + + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtUnloadById = null; + + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtAddById = null; + + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtRemoveById = null; + + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLoadByUrl = null; + + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtAddByUrl = null; + + /** + * @type {import('../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtRemoveByUrl = null; + /** * Create a new AssetReference instance. * @@ -106,30 +148,37 @@ class AssetReference { _bind() { if (this.id) { - if (this._onAssetLoad) this._registry.on(`load:${this.id}`, this._onLoad, this); - if (this._onAssetAdd) this._registry.once(`add:${this.id}`, this._onAdd, this); - if (this._onAssetRemove) this._registry.on(`remove:${this.id}`, this._onRemove, this); - if (this._onAssetUnload) this._registry.on(`unload:${this.id}`, this._onUnload, this); + if (this._onAssetLoad) this._evtLoadById = this._registry.on(`load:${this.id}`, this._onLoad, this); + if (this._onAssetAdd) this._evtAddById = this._registry.once(`add:${this.id}`, this._onAdd, this); + if (this._onAssetRemove) this._evtRemoveById = this._registry.on(`remove:${this.id}`, this._onRemove, this); + if (this._onAssetUnload) this._evtUnloadById = this._registry.on(`unload:${this.id}`, this._onUnload, this); } if (this.url) { - if (this._onAssetLoad) this._registry.on(`load:url:${this.url}`, this._onLoad, this); - if (this._onAssetAdd) this._registry.once(`add:url:${this.url}`, this._onAdd, this); - if (this._onAssetRemove) this._registry.on(`remove:url:${this.url}`, this._onRemove, this); + if (this._onAssetLoad) this._evtLoadByUrl = this._registry.on(`load:url:${this.url}`, this._onLoad, this); + if (this._onAssetAdd) this._evtAddByUrl = this._registry.once(`add:url:${this.url}`, this._onAdd, this); + if (this._onAssetRemove) this._evtRemoveByUrl = this._registry.on(`remove:url:${this.url}`, this._onRemove, this); } } _unbind() { if (this.id) { - if (this._onAssetLoad) this._registry.off(`load:${this.id}`, this._onLoad, this); - if (this._onAssetAdd) this._registry.off(`add:${this.id}`, this._onAdd, this); - if (this._onAssetRemove) this._registry.off(`remove:${this.id}`, this._onRemove, this); - if (this._onAssetUnload) this._registry.off(`unload:${this.id}`, this._onUnload, this); + this._evtLoadById?.off(); + this._evtLoadById = null; + this._evtAddById?.off(); + this._evtAddById = null; + this._evtRemoveById?.off(); + this._evtRemoveById = null; + this._evtUnloadById?.off(); + this._evtUnloadById = null; } if (this.url) { - if (this._onAssetLoad) this._registry.off(`load:${this.url}`, this._onLoad, this); - if (this._onAssetAdd) this._registry.off(`add:${this.url}`, this._onAdd, this); - if (this._onAssetRemove) this._registry.off(`remove:${this.url}`, this._onRemove, this); + this._evtLoadByUrl?.off(); + this._evtLoadByUrl = null; + this._evtAddByUrl?.off(); + this._evtAddByUrl = null; + this._evtRemoveByUrl?.off(); + this._evtRemoveByUrl = null; } } diff --git a/src/framework/components/camera/component.js b/src/framework/components/camera/component.js index b904878b47a..8658b1eff2b 100644 --- a/src/framework/components/camera/component.js +++ b/src/framework/components/camera/component.js @@ -98,6 +98,24 @@ class CameraComponent extends Component { /** @private */ _camera = new Camera(); + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + /** * Create a new CameraComponent instance. * @@ -1020,16 +1038,20 @@ class CameraComponent extends Component { } onEnable() { - const system = this.system; - const scene = system.app.scene; + const scene = this.system.app.scene; const layers = scene.layers; - system.addCamera(this); + this.system.addCamera(this); + + this._evtLayersChanged?.off(); + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); - scene.on('set:layers', this.onLayersChanged, this); if (layers) { - layers.on('add', this.onLayerAdded, this); - layers.on('remove', this.onLayerRemoved, this); + this._evtLayerAdded?.off(); + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } if (this.enabled && this.entity.enabled) { @@ -1040,21 +1062,24 @@ class CameraComponent extends Component { } onDisable() { - const system = this.system; - const scene = system.app.scene; + const scene = this.system.app.scene; const layers = scene.layers; this.postEffects.disable(); this.removeCameraFromLayers(); - scene.off('set:layers', this.onLayersChanged, this); + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; + if (layers) { - layers.off('add', this.onLayerAdded, this); - layers.off('remove', this.onLayerRemoved, this); + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } - system.removeCamera(this); + this.system.removeCamera(this); } onRemove() { diff --git a/src/framework/components/element/component.js b/src/framework/components/element/component.js index a2e4daf93d3..f3b0cdac02b 100644 --- a/src/framework/components/element/component.js +++ b/src/framework/components/element/component.js @@ -212,6 +212,24 @@ class ElementComponent extends Component { */ static EVENT_TOUCHCANCEL = 'touchcancel'; + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + /** * Create a new ElementComponent instance. * @@ -2525,6 +2543,9 @@ class ElementComponent extends Component { } onEnable() { + const scene = this.system.app.scene; + const layers = scene.layers; + if (this._image) { this._image.onEnable(); } @@ -2539,10 +2560,11 @@ class ElementComponent extends Component { this.system.app.elementInput.addElement(this); } - this.system.app.scene.on('set:layers', this.onLayersChanged, this); - if (this.system.app.scene.layers) { - this.system.app.scene.layers.on('add', this.onLayerAdded, this); - this.system.app.scene.layers.on('remove', this.onLayerRemoved, this); + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); + + if (layers) { + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } if (this._batchGroupId >= 0) { @@ -2553,10 +2575,17 @@ class ElementComponent extends Component { } onDisable() { - this.system.app.scene.off('set:layers', this.onLayersChanged, this); - if (this.system.app.scene.layers) { - this.system.app.scene.layers.off('add', this.onLayerAdded, this); - this.system.app.scene.layers.off('remove', this.onLayerRemoved, this); + const scene = this.system.app.scene; + const layers = scene.layers; + + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; + + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } if (this._image) this._image.onDisable(); diff --git a/src/framework/components/element/image-element.js b/src/framework/components/element/image-element.js index b9cf60e4283..6a5e4c9c46b 100644 --- a/src/framework/components/element/image-element.js +++ b/src/framework/components/element/image-element.js @@ -260,6 +260,12 @@ class ImageRenderable { } class ImageElement { + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtSetMeshes = null; + constructor(element) { this._element = element; this._entity = element.entity; @@ -791,7 +797,7 @@ class ImageElement { // Hook up event handlers on sprite asset _bindSprite(sprite) { - sprite.on('set:meshes', this._onSpriteMeshesChange, this); + this._evtSetMeshes = sprite.on('set:meshes', this._onSpriteMeshesChange, this); sprite.on('set:pixelsPerUnit', this._onSpritePpuChange, this); sprite.on('set:atlas', this._onAtlasTextureChange, this); if (sprite.atlas) { @@ -800,7 +806,8 @@ class ImageElement { } _unbindSprite(sprite) { - sprite.off('set:meshes', this._onSpriteMeshesChange, this); + this._evtSetMeshes?.off(); + this._evtSetMeshes = null; sprite.off('set:pixelsPerUnit', this._onSpritePpuChange, this); sprite.off('set:atlas', this._onAtlasTextureChange, this); if (sprite.atlas) { diff --git a/src/framework/components/gsplat/component.js b/src/framework/components/gsplat/component.js index ea818db138b..4cfbbb37f10 100644 --- a/src/framework/components/gsplat/component.js +++ b/src/framework/components/gsplat/component.js @@ -43,6 +43,24 @@ class GSplatComponent extends Component { */ _materialOptions = null; + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + /** * Create a new GSplatComponent. * @@ -317,10 +335,13 @@ class GSplatComponent extends Component { onEnable() { const scene = this.system.app.scene; - scene.on('set:layers', this.onLayersChanged, this); - if (scene.layers) { - scene.layers.on('add', this.onLayerAdded, this); - scene.layers.on('remove', this.onLayerRemoved, this); + const layers = scene.layers; + + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); + + if (layers) { + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } if (this._instance) { @@ -332,10 +353,16 @@ class GSplatComponent extends Component { onDisable() { const scene = this.system.app.scene; - scene.off('set:layers', this.onLayersChanged, this); - if (scene.layers) { - scene.layers.off('add', this.onLayerAdded, this); - scene.layers.off('remove', this.onLayerRemoved, this); + const layers = scene.layers; + + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; + + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } this.removeFromLayers(); diff --git a/src/framework/components/light/component.js b/src/framework/components/light/component.js index 6472c80f79e..1923d5ef8da 100644 --- a/src/framework/components/light/component.js +++ b/src/framework/components/light/component.js @@ -36,6 +36,24 @@ import { properties } from './data.js'; * @category Graphics */ class LightComponent extends Component { + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + /** * Creates a new LightComponent instance. * @@ -1224,12 +1242,16 @@ class LightComponent extends Component { } onEnable() { + const scene = this.system.app.scene; + const layers = scene.layers; + this.light.enabled = true; - this.system.app.scene.on('set:layers', this.onLayersChanged, this); - if (this.system.app.scene.layers) { - this.system.app.scene.layers.on('add', this.onLayerAdded, this); - this.system.app.scene.layers.on('remove', this.onLayerRemoved, this); + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); + + if (layers) { + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } if (this.enabled && this.entity.enabled) { @@ -1242,12 +1264,19 @@ class LightComponent extends Component { } onDisable() { + const scene = this.system.app.scene; + const layers = scene.layers; + this.light.enabled = false; - this.system.app.scene.off('set:layers', this.onLayersChanged, this); - if (this.system.app.scene.layers) { - this.system.app.scene.layers.off('add', this.onLayerAdded, this); - this.system.app.scene.layers.off('remove', this.onLayerRemoved, this); + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; + + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } this.removeLightFromLayers(); diff --git a/src/framework/components/model/component.js b/src/framework/components/model/component.js index 0b933015109..69a03bfcc04 100644 --- a/src/framework/components/model/component.js +++ b/src/framework/components/model/component.js @@ -124,6 +124,24 @@ class ModelComponent extends Component { _batchGroup = null; // #endif + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + /** * Create a new ModelComponent instance. * @@ -933,11 +951,13 @@ class ModelComponent extends Component { onEnable() { const app = this.system.app; const scene = app.scene; + const layers = scene?.layers; + + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); - scene.on('set:layers', this.onLayersChanged, this); - if (scene.layers) { - scene.layers.on('add', this.onLayerAdded, this); - scene.layers.on('remove', this.onLayerRemoved, this); + if (layers) { + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } const isAsset = (this._type === 'asset'); @@ -984,11 +1004,16 @@ class ModelComponent extends Component { onDisable() { const app = this.system.app; const scene = app.scene; + const layers = scene.layers; + + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; - scene.off('set:layers', this.onLayersChanged, this); - if (scene.layers) { - scene.layers.off('add', this.onLayerAdded, this); - scene.layers.off('remove', this.onLayerRemoved, this); + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } if (this._batchGroupId >= 0) { diff --git a/src/framework/components/particle-system/component.js b/src/framework/components/particle-system/component.js index f7fde48002d..b8b5748af3e 100644 --- a/src/framework/components/particle-system/component.js +++ b/src/framework/components/particle-system/component.js @@ -104,6 +104,30 @@ class ParticleSystemComponent extends Component { /** @private */ _drawOrder = 0; + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtSetMeshes = null; + /** * Create a new ParticleSystemComponent. * @@ -1717,9 +1741,8 @@ class ParticleSystemComponent extends Component { asset.off('unload', this._onRenderAssetUnload, this); asset.off('remove', this._onRenderAssetRemove, this); - if (asset.resource) { - asset.resource.off('set:meshes', this._onRenderSetMeshes, this); - } + this._evtSetMeshes?.off(); + this._evtSetMeshes = null; } _onRenderAssetLoad(asset) { @@ -1740,8 +1763,8 @@ class ParticleSystemComponent extends Component { return; } - render.off('set:meshes', this._onRenderSetMeshes, this); - render.on('set:meshes', this._onRenderSetMeshes, this); + this._evtSetMeshes?.off(); + this._evtSetMeshes = render.on('set:meshes', this._onRenderSetMeshes, this); if (render.meshes) { this._onRenderSetMeshes(render.meshes); @@ -1827,6 +1850,9 @@ class ParticleSystemComponent extends Component { } onEnable() { + const scene = this.system.app.scene; + const layers = scene.layers; + // get data store once const data = this.data; @@ -1948,10 +1974,11 @@ class ParticleSystemComponent extends Component { this.addMeshInstanceToLayers(); } - this.system.app.scene.on('set:layers', this.onLayersChanged, this); - if (this.system.app.scene.layers) { - this.system.app.scene.layers.on('add', this.onLayerAdded, this); - this.system.app.scene.layers.on('remove', this.onLayerRemoved, this); + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); + + if (layers) { + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } if (this.enabled && this.entity.enabled && data.depthSoftening) { @@ -1960,10 +1987,17 @@ class ParticleSystemComponent extends Component { } onDisable() { - this.system.app.scene.off('set:layers', this.onLayersChanged, this); - if (this.system.app.scene.layers) { - this.system.app.scene.layers.off('add', this.onLayerAdded, this); - this.system.app.scene.layers.off('remove', this.onLayerRemoved, this); + const scene = this.system.app.scene; + const layers = scene.layers; + + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; + + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } if (this.emitter) { diff --git a/src/framework/components/render/component.js b/src/framework/components/render/component.js index 640c07dc1d9..d0b47aca093 100644 --- a/src/framework/components/render/component.js +++ b/src/framework/components/render/component.js @@ -141,6 +141,30 @@ class RenderComponent extends Component { */ _rootBone; + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtSetMeshes = null; + /** * Create a new RenderComponent. * @@ -788,15 +812,17 @@ class RenderComponent extends Component { onEnable() { const app = this.system.app; const scene = app.scene; + const layers = scene.layers; this._rootBone.onParentComponentEnable(); this._cloneSkinInstances(); - scene.on('set:layers', this.onLayersChanged, this); - if (scene.layers) { - scene.layers.on('add', this.onLayerAdded, this); - scene.layers.on('remove', this.onLayerRemoved, this); + this._evtLayersChanged = scene.on('set:layers', this.onLayersChanged, this); + + if (layers) { + this._evtLayerAdded = layers.on('add', this.onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this.onLayerRemoved, this); } const isAsset = (this._type === 'asset'); @@ -821,11 +847,16 @@ class RenderComponent extends Component { onDisable() { const app = this.system.app; const scene = app.scene; + const layers = scene.layers; + + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; - scene.off('set:layers', this.onLayersChanged, this); - if (scene.layers) { - scene.layers.off('add', this.onLayerAdded, this); - scene.layers.off('remove', this.onLayerRemoved, this); + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } if (this._batchGroupId >= 0) { @@ -879,8 +910,8 @@ class RenderComponent extends Component { if (this._assetReference.asset) { const render = this._assetReference.asset.resource; - render.off('set:meshes', this._onSetMeshes, this); - render.on('set:meshes', this._onSetMeshes, this); + this._evtSetMeshes?.off(); + this._evtSetMeshes = render.on('set:meshes', this._onSetMeshes, this); if (render.meshes) { this._onSetMeshes(render.meshes); } @@ -955,9 +986,8 @@ class RenderComponent extends Component { } _onRenderAssetRemove() { - if (this._assetReference.asset && this._assetReference.asset.resource) { - this._assetReference.asset.resource.off('set:meshes', this._onSetMeshes, this); - } + this._evtSetMeshes?.off(); + this._evtSetMeshes = null; this._onRenderAssetUnload(); } diff --git a/src/framework/components/sprite/component.js b/src/framework/components/sprite/component.js index c83ebd263e9..24e0bb8743e 100644 --- a/src/framework/components/sprite/component.js +++ b/src/framework/components/sprite/component.js @@ -105,6 +105,24 @@ class SpriteComponent extends Component { */ static EVENT_LOOP = 'loop'; + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayersChanged = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerAdded = null; + + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtLayerRemoved = null; + /** * Create a new SpriteComponent instance. * @@ -657,11 +675,13 @@ class SpriteComponent extends Component { onEnable() { const app = this.system.app; const scene = app.scene; + const layers = scene.layers; - scene.on('set:layers', this._onLayersChanged, this); - if (scene.layers) { - scene.layers.on('add', this._onLayerAdded, this); - scene.layers.on('remove', this._onLayerRemoved, this); + this._evtLayersChanged = scene.on('set:layers', this._onLayersChanged, this); + + if (layers) { + this._evtLayerAdded = layers.on('add', this._onLayerAdded, this); + this._evtLayerRemoved = layers.on('remove', this._onLayerRemoved, this); } this._showModel(); @@ -677,11 +697,16 @@ class SpriteComponent extends Component { onDisable() { const app = this.system.app; const scene = app.scene; + const layers = scene.layers; + + this._evtLayersChanged?.off(); + this._evtLayersChanged = null; - scene.off('set:layers', this._onLayersChanged, this); - if (scene.layers) { - scene.layers.off('add', this._onLayerAdded, this); - scene.layers.off('remove', this._onLayerRemoved, this); + if (layers) { + this._evtLayerAdded?.off(); + this._evtLayerAdded = null; + this._evtLayerRemoved?.off(); + this._evtLayerRemoved = null; } this.stop(); diff --git a/src/framework/components/sprite/sprite-animation-clip.js b/src/framework/components/sprite/sprite-animation-clip.js index eb72b0448ec..d47f8b4ef8e 100644 --- a/src/framework/components/sprite/sprite-animation-clip.js +++ b/src/framework/components/sprite/sprite-animation-clip.js @@ -78,6 +78,12 @@ class SpriteAnimationClip extends EventHandler { */ static EVENT_LOOP = 'loop'; + /** + * @type {import('../../../core/event-handle.js').EventHandle|null} + * @private + */ + _evtSetMeshes = null; + /** * Create a new SpriteAnimationClip instance. * @@ -169,7 +175,8 @@ class SpriteAnimationClip extends EventHandler { */ set sprite(value) { if (this._sprite) { - this._sprite.off('set:meshes', this._onSpriteMeshesChange, this); + this._evtSetMeshes?.off(); + this._evtSetMeshes = null; this._sprite.off('set:pixelsPerUnit', this._onSpritePpuChanged, this); this._sprite.off('set:atlas', this._onSpriteMeshesChange, this); if (this._sprite.atlas) { @@ -180,7 +187,7 @@ class SpriteAnimationClip extends EventHandler { this._sprite = value; if (this._sprite) { - this._sprite.on('set:meshes', this._onSpriteMeshesChange, this); + this._evtSetMeshes = this._sprite.on('set:meshes', this._onSpriteMeshesChange, this); this._sprite.on('set:pixelsPerUnit', this._onSpritePpuChanged, this); this._sprite.on('set:atlas', this._onSpriteMeshesChange, this);