在处理五游联盟这套平台在苹果端运行时,曾遇到一个 Spine 动画播放完成后界面没有及时清除节点的问题,表现为:动画播放完毕后残影卡在屏幕上,多次触发会造成动画节点堆叠,界面严重卡顿。这个问题在 Android 端不明显,但在 ios 平台下尤其突出。
问题定位在某个更新包内的 GameTableUI.luac
文件。因为是加密的 .luac
文件,首先要做的就是将其解密。解密工具请根据你当前环境自行选择,这里记录的是解密所需的签名和密钥信息:
签名(sign):szhuomei
密钥(key):szhmkj0odfsOdsfADfs888888
解密成功后,用文本工具(推荐 VSCode)打开 GameTableUI.lua
,搜索如下代码段:
end, sp.EventType.ANIMATION_COMPLETE)
local function closeA(dt)
skeletonNode:removeFromParent()
self.sp:removeFromParent()
end
self:schedule(closeA, 1, "")
skeletonNode:registerSpineEventHandler(function (event)
end, sp.EventType.ANIMATION_EVENT)
这段逻辑是动画播放完成后延迟一秒执行 removeFromParent()
,但问题在于它只在 ANIMATION_COMPLETE
事件中监听清除行为,而实际播放过程中某些动画帧没有正确触发这个事件,导致动画播放完成后节点并没有被真正清除。
为了解决这个问题,只需要在原有逻辑下方手动添加一次动画事件监听,并在回调里直接调用清理逻辑。修改后的代码如下:
end, sp.EventType.ANIMATION_COMPLETE)
local function closeA(dt)
skeletonNode:removeFromParent()
self.sp:removeFromParent()
end
self:schedule(closeA, 1, "")
skeletonNode:registerSpineEventHandler(function (event)
skeletonNode:removeFromParent()
if self.sp then
self.sp:removeFromParent()
end
end, sp.EventType.ANIMATION_EVENT)
这里增加了红色代码(原文描述中的红色部分),核心逻辑就是再次注册一次事件处理,确保无论动画是否准确触发 ANIMATION_COMPLETE
,都能通过 ANIMATION_EVENT
执行一次清理逻辑。
改完之后请重新加密 GameTableUI.lua
文件生成 .luac
,然后替换到更新包对应位置。
注意:
- 替换前备份原
.luac
; - 加密工具使用相同签名与密钥;
- 编译后建议在真机进行测试确认动画节点是否彻底清除。
这样一来,苹果端动画残留的问题就能彻底解决。
仅限技术交流,禁止商用!