diff --git a/packages/core/src/Renderer.ts b/packages/core/src/Renderer.ts index aa79393565..efcbf09158 100644 --- a/packages/core/src/Renderer.ts +++ b/packages/core/src/Renderer.ts @@ -349,8 +349,8 @@ export class Renderer extends Component implements IComponentCustomClone { */ protected override _onDestroy(): void { super._onDestroy(); - this.entity.transform._updateFlagManager.removeListener(this._onTransformChanged); + this._unRegisterEntityTransformListener(); this.shaderData._addReferCount(-1); const materials = this._materials; @@ -416,6 +416,13 @@ export class Renderer extends Component implements IComponentCustomClone { this.entity.transform._updateFlagManager.addListener(this._onTransformChanged); } + /** + * @internal + */ + protected _unRegisterEntityTransformListener(): void { + this.entity.transform._updateFlagManager.removeListener(this._onTransformChanged); + } + /** * @internal */ diff --git a/packages/core/src/mesh/SkinnedMeshRenderer.ts b/packages/core/src/mesh/SkinnedMeshRenderer.ts index 579a7ed4dc..7b2a715690 100644 --- a/packages/core/src/mesh/SkinnedMeshRenderer.ts +++ b/packages/core/src/mesh/SkinnedMeshRenderer.ts @@ -86,9 +86,9 @@ export class SkinnedMeshRenderer extends MeshRenderer { set rootBone(value: Entity) { if (this._rootBone !== value) { - this._rootBone?.transform._updateFlagManager.removeListener(this._onTransformChanged); - value.transform._updateFlagManager.addListener(this._onTransformChanged); + this._unRegisterEntityTransformListener(); this._rootBone = value; + this._registerEntityTransformListener(); this._dirtyUpdateFlag |= RendererUpdateFlags.WorldVolume; } } @@ -173,7 +173,7 @@ export class SkinnedMeshRenderer extends MeshRenderer { */ protected override _updateShaderData(context: RenderContext): void { const entity = this.entity; - const worldMatrix = this._rootBone ? this._rootBone.transform.worldMatrix : entity.transform.worldMatrix; + const worldMatrix = (this._rootBone ?? entity).transform.worldMatrix; this._updateTransformShaderData(context, worldMatrix); const shaderData = this.shaderData; @@ -235,7 +235,7 @@ export class SkinnedMeshRenderer extends MeshRenderer { */ override _onDestroy(): void { super._onDestroy(); - this._rootBone?.transform._updateFlagManager.removeListener(this._onTransformChanged); + this._unRegisterEntityTransformListener(); this._rootBone = null; this._jointDataCreateCache = null; this._skin = null; @@ -280,7 +280,14 @@ export class SkinnedMeshRenderer extends MeshRenderer { * @internal */ protected override _registerEntityTransformListener(): void { - // Cancel register listener to entity transform. + (this._rootBone ?? this._entity).transform._updateFlagManager.addListener(this._onTransformChanged); + } + + /** + * @internal + */ + protected override _unRegisterEntityTransformListener(): void { + (this._rootBone ?? this._entity).transform._updateFlagManager.removeListener(this._onTransformChanged); } /**