首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Phaser 重开关卡后完成事件触发两次?清理场景监听器

Phaser 重开关卡后完成事件触发两次?清理场景监听器

原创
作者头像
用户12807590
发布于 2026-10-09 09:01:11
发布于 2026-10-09 09:01:11
120
举报

本文由 FrameSprite 作者工作流整理,AI 辅助编写,引用原始技术资料;构造案例不代表模型或引擎实测。

区分游戏级动画定义与场景实例监听器,重启时复用动画键并解除属于旧场景的订阅。

简要答案

Phaser 的共享动画定义与一次场景启动的监听器有不同生命周期。重复启动场景时,先检查动画键是否已存在;属于场景的外部事件订阅应在 shutdown 时解除。一次动作完成多次触发,先核对连接数量与旧闭包,而不是删除全局动画或改变序列帧 FPS。

适用范围

  • 关卡重启后同一次动画发出多次奖励、音效或状态切换。

不适用范围

  • 画面真正播放了多个角色或多个动作实例,应先分开事件来源。

1. 区分定义与实例

把动画键、贴图键和当前角色实例分别记录。共享 Animation Manager 的定义可跨场景存在,当前场景角色与其回调不应被旧场景的闭包继续持有。

2. 避免重复创建共享键

创建前用动画管理器查询 key 是否存在,必要时明确处理素材版本更新。不能每次 create 都无条件重建同名动画,也不能为了避免重复一口气移除其他场景使用的动画。

3. 在 shutdown 解除外部订阅

订阅全局事件或自建事件总线时,保存函数引用并在场景 shutdown 解除相同引用。匿名函数若无法再次定位,可能导致 off 未能移除原监听器。对象自己销毁是否清理事件要按具体发射器核对。

4. 连续重启三次验收

连续启动、完成动作、重启三次。每次记录场景编号与回调计数,预期每轮一次。再测试两个场景同时使用同一帧灵动作,确认其中一个退出不破坏另一个。

构造示例:三轮场景的订阅数

每轮添加 1 个外部监听器,shutdown 移除;对比从不解除的版本。

正确版本每轮活跃监听器为 1,退出后为 0;错误版本三轮增长到 3。

这是生命周期计数样本,不代表所有 Phaser 内建发射器都会泄漏。

生命周期所有权

资源

归属

退出时

shared animation

game-level manager

preserve if shared

actor playback

scene instance

release actor

external listener

scene run

unsubscribe same handler

重复三次重开,数清有效监听器

每次场景启动都向一个长寿命事件源注册完成监听,若不在退出时清理,三次启动后可能保留 3 个处理函数。管理后的目标是在每次运行中只有 1 个,在 Shutdown 后为 0。先确认监听器挂在 Scene 私有源还是全局源,再以同一个函数引用解除;临时重新创建的函数引用无法匹配原监听。还要检查重复触发是否来自动作本身被播放两次。记录注册、解除和回调计数,才能区别生命周期泄漏与正常的多个动画事件。

  • 验收:事件源寿命
  • 验收:同一函数引用
  • 验收:播放次数

一次通知也可能连接多次

once 表示一次注册只调用一次,并不阻止代码重复注册三次。若每次进入界面都增加一个等待完成的监听器,事件仍可触发三个闭包。检查注册路径和退出路径,比把奖励代码包在一个临时布尔值里更能解决根因。

编辑与示例说明

本次补充由 AI 辅助整理,按公开原始技术资料核对。可下载的输入与预期结果是原创构造案例,不代表模型或引擎实测;实际项目应按步骤保留自己的验收记录。

常见问题

所有动画都要每次重新创建吗?

不必,共享定义可以复用,先检查键与修订。

once 就保证只回调一次吗?

只保证一次注册的调用次数,多次注册仍会各调用。

删除角色会清理全局订阅吗?

不能假设,要按发射器与持有者生命周期处理。

来源与补充材料

Scenes · Phaser

Animations · Phaser

原文:https://cn.framesprite.com/guides/phaser-scene-restart-animation-listener-lifecycle

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 简要答案
  • 适用范围
  • 不适用范围
  • 1. 区分定义与实例
  • 2. 避免重复创建共享键
  • 3. 在 shutdown 解除外部订阅
  • 4. 连续重启三次验收
  • 构造示例:三轮场景的订阅数
  • 生命周期所有权
  • 重复三次重开,数清有效监听器
  • 一次通知也可能连接多次
  • 编辑与示例说明
  • 常见问题
    • 所有动画都要每次重新创建吗?
    • once 就保证只回调一次吗?
    • 删除角色会清理全局订阅吗?
  • 来源与补充材料
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档