using System; using System.Collections; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.UI; using DG.Tweening; using UnityEngine; namespace AibisDream.FixSystem { public class FixStateMachine { public FixState CurState => _stateMachine.CurState; private StateMachine _stateMachine; private FixSystemData _data; public FixStateMachine(FixSystemData data) { _data = data; _stateMachine = new StateMachine(CreateState); _stateMachine.OnStateSwitch += state => EnumEventSystem.Global.Send(EventEnum.FixStateSwitch, state); } public IEnumerator Init(FixState initState) { _data.curState = initState; _data.args = ""; yield return _stateMachine.Init(initState); } public IEnumerator SwitchState(FixState nextState, string args = "") { _data.curState = nextState; _data.args = args; yield return _stateMachine.SwitchState(nextState, args); } /// /// 读档专用:跳过动画直接切换状态。不触发 Exit/Enter 动画,只执行 EnterImmediate。 /// 通过 同步 _stateMachine 内部状态,避免与正常 SwitchState 分叉。 /// public IEnumerator SwitchStateImmediate(FixState nextState, string args = "") { if (_stateMachine.HasState && CurState.Equals(nextState)) yield break; _stateMachine.SetStateImmediate(nextState, args); _data.curState = nextState; _data.args = args; if (_stateMachine.CurrentStateObj is IFixState fixState) yield return fixState.EnterImmediate(); else yield return _stateMachine.CurrentStateObj.Enter(); } public IEnumerator QuitState() { _data.curState = FixState.Default; yield return _stateMachine.QuitState(); } private static IState CreateState(FixState nextState, string args) { IState res = nextState switch { FixState.Default => new DefaultState(), FixState.Clinic => new ClinicState(), FixState.BodyModule => new BodyModuleState(), FixState.Memory => new MemoryState(), FixState.Eye => new EyeState(), FixState.UF => new UfState(), FixState.Expression => new ExpressionState(), FixState.Emo => new EmoState(), FixState.Op => new OpState(), FixState.EmoCut => new EmoCutState(), FixState.MemoryCut => new MemoryCutState(), FixState.LogicCut => new LogicCutState(), FixState.Dream => new DreamState(), FixState.AnalysisMode => new AnalysisModeState(), FixState.Sales => new SalesState(), FixState.BlockPuzzle => new BlockPuzzleState(), _ => new DefaultState() }; res.SetArgs(args); return res; } } public enum FixState { Default = 0, Clinic = 1, BodyModule = 2, Memory = 3, Eye = 4, UF = 5, Expression = 6, Emo = 9, Op = 10, EmoCut = 11, MemoryCut = 12, LogicCut = 13, Dream = 14, AnalysisMode = 15, Sales = 16, BlockPuzzle = 17 } public struct DefaultState : IFixState { public FixState GetState => FixState.Default; public IEnumerator Enter() { CameraKit.Instance.SwitchCamera(CameraEnum.Clinic, true); var clinicSystem = FixSystemCenter.SystemDic.Get(); var data = clinicSystem.bubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); yield break; } public IEnumerator Exit() { yield break; } } public struct ClinicState : IFixState { public FixState GetState => FixState.Clinic; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { // 先加载对话气泡,避免 Yarn 对话(如 测试 节点 me: 释放log)在相机切换完成前执行时找不到 Player 槽位 var clinicSystem = FixSystemCenter.SystemDic.Get(); // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Clinic); var data = clinicSystem.bubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); } public IEnumerator Exit() { // 无 yield break; } } public struct BodyModuleState : IFixState { private string _args; public FixState GetState => FixState.BodyModule; public void SetArgs(string args) { // 设置参数 _args = args; } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var cablePanel = FixPanelSystem.GetRepairPanel(); // 拔出插头 // 切换Body或Head if (Enum.TryParse(_args, out var moduleState)) { bodyModuleSystem.SwitchModuleGroup(moduleState); } if (cablePanel != null && !FixPanelSystem.Instance.IsSystemOn) { // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModuleCenter); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); yield return new WaitForSeconds(0.5f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); yield return FixPanelSystem.Instance.StartAllSystems(); } else { FixPanelSystem.GetRepairPanel().ResetPlug(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 加载气泡 var data = FixPanelSystem.Instance.BubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); // 开启交互 bodyModuleSystem.EnableSystem(); } public IEnumerator Exit() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); // 拔出插头 FixPanelSystem.GetRepairPanel().ResetPlug(); // 关闭交互 bodyModuleSystem.DisableSystem(); yield break; } } public struct UfState : IFixState { public FixState GetState => FixState.UF; public void SetArgs(string args) { } public IEnumerator Enter() { var ufSystem = FixSystemCenter.SystemDic.Get(); var eyeSystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 插头回到初始插孔 FixPanelSystem.GetRepairPanel().ResetPlug(); // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.UF); yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); ufSystem.OpenUFView(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.EyeDeep); eyeSystem.OnEnter(); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); var data = eyeSystem.bubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); } public IEnumerator Exit() { float duration = 0.5f; var ufSystem = FixSystemCenter.SystemDic.Get(); var eyeSystem = FixSystemCenter.SystemDic.Get(); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); eyeSystem.OnExit(); ufSystem.CloseUFView(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.UF); yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); } } public struct EyeState : IFixState { public FixState GetState => FixState.Eye; public void SetArgs(string args) { } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); bodyModuleSystem.SwitchModuleGroup(ModuleState.Head); var eyeSystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } //打开盖子 var eyeModule = bodyModuleSystem.FindBodyModuleByType(); yield return eyeModule.OpenEye(); // 插头回到初始插孔 FixPanelSystem.GetRepairPanel().ResetPlug(); // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Eye); yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.EyeDeep); eyeSystem.OnEnter(); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); var data = eyeSystem.bubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); } public IEnumerator Exit() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); float duration = 0.5f; var eyeSystem = FixSystemCenter.SystemDic.Get(); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); yield return CameraKit.Instance.SwitchCamera(CameraEnum.Eye); eyeSystem.OnExit(); yield return new WaitForSeconds(0.1f); yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); //关上 var eyeModule = bodyModuleSystem.FindBodyModuleByType(); yield return eyeModule.CloseEye(); yield return new WaitForSeconds(0.5f); } } public struct MemoryState : IFixState { public FixState GetState => FixState.Memory; public void SetArgs(string args) { } public IEnumerator Enter() { float duration = 0.5f; var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var memorySystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } yield return memorySystem.DropMemoryProjector(); // 插头回到初始插孔 FixPanelSystem.GetRepairPanel().ResetPlug(); // 相机聚焦到目标位 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Memory); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); memorySystem.OnEnter(); yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); var data = memorySystem.BubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); } public IEnumerator Exit() { float duration = 0.5f; var memorySystem = FixSystemCenter.SystemDic.Get(); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); memorySystem.OnExit(); memorySystem.CloseMemoryView(); yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); memorySystem.PullMemoryProjector(); } } public struct ExpressionState : IFixState { public FixState GetState => FixState.Expression; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { // 获取表达系统 var expressionManager = FixSystemCenter.SystemDic.Get(); // 先切 BodyModule(如果需要) if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { var bodyModule = FixSystemCenter.SystemDic.Get(); bodyModule.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 开启表达系统视图,并播放火山表达深入 // 切换到表达相机 yield return TimelineCenter.Instance.PlayTimelineAsync("透镜/透镜in"); yield return CameraKit.Instance.SwitchCamera(CameraEnum.Expression); yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); expressionManager.OpenView(); // 切换到深度表达相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.ExpressionDeep); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); yield return TimelineCenter.Instance.PlayTimelineAsync("火山表达模块/火山表达深入"); } public IEnumerator Exit() { var expressionManager = FixSystemCenter.SystemDic.Get(); var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); // 重置身体模块 FixPanelSystem.GetRepairPanel().ResetPlug(); // 关闭表达系统视图 expressionManager.CloseView(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.Expression); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); yield return TimelineCenter.Instance.PlayTimelineAsync("透镜/透镜out"); yield break; } } public struct EmoState : IFixState { public FixState GetState => FixState.Emo; public void SetArgs(string args) { } public IEnumerator Enter() { var emoManager = FixSystemCenter.SystemDic.Get(); if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { var bodyModule = FixSystemCenter.SystemDic.Get(); bodyModule.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } yield return CameraKit.Instance.SwitchCamera(CameraEnum.Emo); yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); //emoManager.OpenView(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.EmoDeep); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); } public IEnumerator Exit() { FixPanelSystem.GetRepairPanel().ResetPlug(); yield break; } } public struct OpState : IFixState { public FixState GetState => FixState.Op; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { if (!CameraKit.Instance.EqualToCameraState(CameraEnum.Op)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.Op); } } public IEnumerator Exit() { // 无 yield break; } } public struct DreamState : IFixState { public FixState GetState => FixState.Dream; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { if (!CameraKit.Instance.EqualToCameraState(CameraEnum.DreamCamera)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.DreamCamera); var openSystem = FixSystemCenter.SystemDic.Get(); DialogUIManager.Instance.LoadBubbles(openSystem.bubbleSlotGroup.CollectData()); } } public IEnumerator Exit() { // 无 yield break; } } public struct EmoCutState : IFixState { public FixState GetState => FixState.EmoCut; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var cuttingManager = FixSystemCenter.SystemDic.Get(); if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { bodyModuleSystem.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // Cut的气泡统一放在BodyModule下 DialogUIManager.Instance.LoadBubbles(cuttingManager.bubbleSlotGroup.CollectData()); FixPanelSystem.GetRepairPanel().ResetPlug(); var bodyModule = bodyModuleSystem.FindBodyModuleByName("Emo"); if (bodyModule != null) { bodyModule.GetCutSpriteRenderer().sortingOrder = 100; bodyModule.GetCutTextSpriteRenderer().sortingOrder = 101; bodyModule.GetCutSpriteRenderer().color = new Color(1f, 1f, 1f, 1f); bodyModule.GetCutSpriteRenderer().GetComponentInChildren().color = new Color(1f, 1f, 1f, 1f); } yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutEmo); yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutEmoDeep); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); yield return cuttingManager.StartCutting(bodyModule); } public IEnumerator Exit() { // 无 yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); var cuttingManager = FixSystemCenter.SystemDic.Get(); cuttingManager.ClearCutLine(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutEmo); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); } } public struct MemoryCutState : IFixState { public FixState GetState => FixState.MemoryCut; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var cuttingManager = FixSystemCenter.SystemDic.Get(); if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { bodyModuleSystem.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // Cut的气泡统一放在BodyModule下 DialogUIManager.Instance.LoadBubbles(cuttingManager.bubbleSlotGroup.CollectData()); FixPanelSystem.GetRepairPanel().ResetPlug(); var bodyModule = bodyModuleSystem.FindBodyModuleByName("Memory"); if (bodyModule != null) { bodyModule.GetCutSpriteRenderer().sortingOrder = 100; bodyModule.GetCutTextSpriteRenderer().sortingOrder = 101; bodyModule.GetCutSpriteRenderer().color = new Color(1f, 1f, 1f, 1f); bodyModule.GetCutSpriteRenderer().GetComponentInChildren().color = new Color(1f, 1f, 1f, 1f); } yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutMemory); yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutMemoryDeep); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); yield return cuttingManager.StartCutting(bodyModule); } public IEnumerator Exit() { yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); var cuttingManager = FixSystemCenter.SystemDic.Get(); cuttingManager.ClearCutLine(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutMemory); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); } } public struct LogicCutState : IFixState { public FixState GetState => FixState.LogicCut; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { var cuttingManager = FixSystemCenter.SystemDic.Get(); var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { bodyModuleSystem.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // Cut的气泡统一放在BodyModule下 DialogUIManager.Instance.LoadBubbles(cuttingManager.bubbleSlotGroup.CollectData()); var bodyModule = bodyModuleSystem.FindBodyModuleByName("Logic"); if (bodyModule != null) { bodyModule.GetCutSpriteRenderer().sortingOrder = 100; bodyModule.GetCutTextSpriteRenderer().sortingOrder = 101; bodyModule.GetCutSpriteRenderer().color = new Color(1f, 1f, 1f, 1f); bodyModule.GetCutSpriteRenderer().GetComponentInChildren().color = new Color(1f, 1f, 1f, 1f); } yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutLogic); yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutLogicDeep); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); yield return cuttingManager.StartCutting(bodyModule); } public IEnumerator Exit() { yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); var cuttingManager = FixSystemCenter.SystemDic.Get(); cuttingManager.ClearCutLine(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutLogic); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); } } public struct AnalysisModeState : IFixState { public FixState GetState => FixState.AnalysisMode; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var analysisModeManager = FixSystemCenter.SystemDic.Get(); // 先切 BodyModule(如果需要) if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { bodyModuleSystem.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 插头回到初始插孔 FixPanelSystem.GetRepairPanel().ResetPlug(); // 切换到分析模式相机 yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.AnalysisMode); // 进入分析模式 if (analysisModeManager != null) { analysisModeManager.OnEnter(); } yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); } public IEnumerator Exit() { float duration = 0.5f; var analysisModeManager = FixSystemCenter.SystemDic.Get(); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); // 退出分析模式 if (analysisModeManager != null) { analysisModeManager.OnExit(); } yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); } } public struct SalesState : IFixState { private string _systemView; public FixState GetState => FixState.Sales; public void SetArgs(string args) { _systemView = args; } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { bodyModuleSystem.SwitchModuleGroup(ModuleState.Head); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 进入前先播放钳子摘盖子,完成后深入 yield return TimelineCenter.Instance.PlayTimelineAsync("钳子/摘走盖子"); // 获取销售系统管理器 var salesManager = FixSystemCenter.SystemDic.Get(); if (salesManager != null) { // FadeIn yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); // 打开销售系统视图,传入systemView参数 salesManager.OpenView(); // FadeOut yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); // 销售模块使用自身的气泡槽位;缺失时再回退到 ScreenSystem,避免读到错误的槽位配置 if (salesManager.bubbleSlotGroup != null) { var data = salesManager.bubbleSlotGroup.CollectData(); Debug.Log("[SalesState] Loaded bubble slots from SalesManager."); DialogUIManager.Instance.LoadBubbles(data); } else { Debug.LogWarning("[SalesState] SalesManager.bubbleSlotGroup is null, fallback to ScreenSystem bubble slots."); var data = FixPanelSystem.Instance.BubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(data); } } } public IEnumerator Exit() { float duration = 0.5f; var salesManager = FixSystemCenter.SystemDic.Get(); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); // 关闭销售系统视图 if (salesManager != null) { salesManager.CloseView(); } // 关闭前先播放钳子放下盖子,完成后再结 yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); yield return TimelineCenter.Instance.PlayTimelineAsync("钳子/放下盖子"); yield return null; } } public struct BlockPuzzleState : IFixState { private const string puzzleName = "Game2"; private const float blockPuzzleScale = 1.6f; private static BlockPuzzleSystem BlockPuzzleSystem => FixSystemCenter.SystemDic.Get(); private static BodyModuleSystem BodyModuleSystem => FixSystemCenter.SystemDic.Get(); public FixState GetState => FixState.BlockPuzzle; public void SetArgs(string args) { } public IEnumerator Enter() { // 基本操作(其实应该早就处理好了) yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); var bubbleData = FixPanelSystem.Instance.BubbleSlotGroup.CollectData(); DialogUIManager.Instance.LoadBubbles(bubbleData); yield return TimelineCenter.Instance.PlayTimelineAsync(TimelineAssetRef.EngineModuleEnter); // 视角移动 var engineModule = BodyModuleSystem.FindBodyModuleByName("Heart"); Tween tween = RepairSystemManager.Instance.ScaleCurrentSystem(blockPuzzleScale, engineModule.transform.position); if (tween != null) { yield return tween.WaitForCompletion(); } // 初始化拼图 BlockPuzzleSystem.Initialize(puzzleName); // 开启遮罩 yield return FixPanelSystem.Instance.MaskFadeIn(); RepairSystemManager.Instance.SwitchSystem(); yield return new WaitForSeconds(0.5f); yield return FixPanelSystem.Instance.MaskFadeOut(); // 播放进场动画 yield return TimelineCenter.Instance.PlayTimelineAsync(TimelineAssetRef.CablePanelExit); yield return new WaitForSeconds(0.5f); yield return TimelineCenter.Instance.PlayTimelineAsync(TimelineAssetRef.BlockPuzzleEnter); // 解锁 BlockPuzzleSystem.SetLocked(false); } public IEnumerator Exit() { yield break; } } }