结论:用 CanvasGroup.alpha=0 做视觉隐藏,可以 100% 规避 SetActive 失活带来的 Spine 动画错乱
原理对比 SetActive (false) 弊端(原问题根源) 物体被禁用 → Spine 组件Update停止执行、AnimationState内部缓存清理、TrackEntry 实例被引擎销毁、骨骼时间轴冻结;再次启用旧引用失效、姿势停留在断帧,出现播放异常。
CanvasGroup Alpha=0 隐藏优势 GameObject 始终active=true,Spine 组件持续走 Update 帧刷新: AnimationState、轨道数据、TrackEntry 引用全程保留有效 骨骼、插槽数据持续正常运算,动画计时不会中断冻结 再次 alpha 切回 1 时,动画顺着原有进度继续播放,不会出现复位错乱、姿势跑偏 配套隐藏写法(规范) csharp 运行 // 隐藏:透明+屏蔽点击,物体不SetActive canvasGroup.alpha = 0; canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false;
// 显示:恢复透明度+开启交互 canvasGroup.alpha = 1; canvasGroup.interactable = true; canvasGroup.blocksRaycasts = true;
遗留小坑(SkeletonGraphic 专属) SkeletonGraphic 默认 PMA 材质和 CanvasGroup 透明度兼容差,alpha 渐变会出现闪白、变色,修复: SkeletonGraphic 材质勾选 CanvasGroup CompatibleSpine 关闭组件 Advanced→PMA Vertex Colors,改用普通 UI 透明 Shader
两种方案选型总结 频繁显隐、弹窗 / 角色动画:优先 CanvasGroup 透明控制,从根源规避 Sp

