using System; using System.Collections; using AibisDream.Framework; using AibisDream.Kit; using UnityEngine; namespace AibisDream.FixSystem { public class FixStateMachine { public FixState CurState => _curState.GetState; private IState _curState; private string _curArgs; public FixStateMachine() { // 初始化为一个默认状态 _curState = CreateState(FixState.Default, ""); } /// /// 播放诊所到场景的timeline /// /// public IEnumerator PlayClinicCut() { yield return CameraKit.Instance.SwitchCamera(CameraEnum.CoolingMachine); yield return TimelineManager.Instance.PlayTimeline("ToBodyModule"); } public IEnumerator SwitchState(FixState nextState, string args = "") { if (CurState == nextState) yield break; _curArgs = args; yield return _curState?.Exit(); _curState = CreateState(nextState, _curArgs); EnumEventSystem.Global.Send(EventEnum.FixStateSwitch, nextState); yield return _curState.Enter(); } public IEnumerator QuitState() { _curArgs = null; yield return _curState?.Exit(); _curState = null; } private static IState CreateState(FixState nextState, string args) { IState res = nextState switch { FixState.Clinic => new ClinicState(), FixState.Engine => new EngineState(), FixState.BodyModule => new BodyModuleState(), FixState.Memory => new MemoryState(), FixState.Eye => new EyeState(), FixState.UF => new UfState(), FixState.Gear => new GearState(), 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(), _ => new ClinicState() }; res.SetArgs(args); return res; } } public enum FixState { Default, Clinic, BodyModule, Memory, Eye, UF, Expression, Engine, Gear, Emo, Op, EmoCut, MemoryCut, LogicCut, Dream, } public interface IState { public FixState GetState { get; } public void SetArgs(string args); public IEnumerator Enter(); public IEnumerator Exit(); } public struct ClinicState : IState { public FixState GetState => FixState.Clinic; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Clinic); // 注册对话气泡 var clinicSystem = FixSystemCenter.SystemDic.Get(); var data = clinicSystem.bubbleSlotGroup.CollectData(); BubbleGroup.Instance.LoadBubbles(data); Debug.Log("气泡加载完成"); DialogCanvasManager.Instance.SwitchDialogView(DialogViewType.StandardBubble); } public IEnumerator Exit() { // 无 yield break; } } public struct BodyModuleState : IState { private string _args; public FixState GetState => FixState.BodyModule; public void SetArgs(string args) { // 设置参数 _args = args; } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var lightSystem = FixSystemCenter.SystemDic.Get(); // 拔出插头 // 切换Body或Head if (Enum.TryParse(_args, out var moduleState)) { bodyModuleSystem.SwitchModuleGroup(moduleState); } if (lightSystem && !lightSystem.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 lightSystem.StartSystem(); } else { bodyModuleSystem.ResetPlug(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 加载气泡 var data = FixSystemCenter.SystemDic.Get().BubbleSlotGroup.CollectData(); BubbleGroup.Instance.LoadBubbles(data); DialogCanvasManager.Instance.SwitchDialogView(DialogViewType.Screen); // 开启交互 bodyModuleSystem.EnableSystem(); } public IEnumerator Exit() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); // 拔出插头 bodyModuleSystem.ResetPlug(); // 关闭交互 bodyModuleSystem.DisableSystem(); yield break; } } public struct GearState : IState { public FixState GetState => FixState.Gear; private string _configKey; public void SetArgs(string args) { _configKey = args; } public IEnumerator Enter() { // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { // 先切BodyModule var bodyModule = FixSystemCenter.SystemDic.Get(); bodyModule.SwitchModuleGroup(ModuleState.Body); yield return UIManager.Instance.GetPanel().FadeInAsync(0.5f); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.5f); } // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Gear); // 加载关卡数据 if (!string.IsNullOrEmpty(_configKey)) { var gearSystem = FixSystemCenter.SystemDic.Get(); gearSystem.CurDataKey = _configKey; gearSystem.LoadLevel(); } } public IEnumerator Exit() { yield break; } } public struct EngineState : IState { public FixState GetState => FixState.Engine; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { var bodyModule = FixSystemCenter.SystemDic.Get(); bodyModule.SwitchModuleGroup(ModuleState.Body); yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 切换相机 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Engine); } public IEnumerator Exit() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); bodyModuleSystem.ResetPlug(); yield break; } } public struct UfState : IState { public FixState GetState => FixState.UF; public void SetArgs(string args) { } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var ufSystem = FixSystemCenter.SystemDic.Get(); var eyeSystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } // 插头回到初始插孔 bodyModuleSystem.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); } 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); yield return null; } } public struct EyeState : IState { public FixState GetState => FixState.Eye; public void SetArgs(string args) { } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var eyeSystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule)) { yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule); } //打开盖子 SpriteRenderer sp = bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Cover") .GetComponent(); sp.sprite = Resources.Load("Art/Fix/Peipei/Eye/视觉模块盖子打开A"); AudioManager.Instance.PlaySfx("event:/ActionFB/eye_open"); yield return new WaitForSeconds(0.1f); sp.sprite = Resources.Load("Art/Fix/Peipei/Eye/视觉模块盖子打开B"); // 插头回到初始插孔 bodyModuleSystem.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); } 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); //关上 SpriteRenderer sp = bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Cover") .GetComponent(); sp.sprite = Resources.Load("Art/Fix/Peipei/Eye/视觉模块盖子打开A"); AudioManager.Instance.PlaySfx("event:/ActionFB/eye_close"); yield return new WaitForSeconds(0.1f); sp.sprite = Resources.Load("Art/Fix/Peipei/Eye/视觉模块盖子关闭"); yield return new WaitForSeconds(0.5f); } } public struct MemoryState : IState { 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(); // 插头回到初始插孔 bodyModuleSystem.ResetPlug(); // 相机聚焦到目标位 yield return CameraKit.Instance.SwitchCamera(CameraEnum.Memory); yield return UIManager.Instance.GetPanel().FadeInAsync(duration); memorySystem.OnEnter(); yield return UIManager.Instance.GetPanel().FadeOutAsync(duration); } 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 : IState { public FixState GetState => FixState.Expression; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { // 先切BodyModule var expressionManager = 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); } // 切换相机 expressionManager.OpenView(); 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); } public IEnumerator Exit() { var expressionManager = FixSystemCenter.SystemDic.Get(); var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); bodyModuleSystem.ResetPlug(); expressionManager.CloseView(); yield break; } } public struct EmoState : IState { 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() { var emoManager = FixSystemCenter.SystemDic.Get(); var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); bodyModuleSystem.ResetPlug(); emoManager.CloseView(); yield break; } } public struct OpState : IState { 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 : IState { 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(); BubbleGroup.Instance.LoadBubbles(openSystem.bubbleSlotGroup.CollectData()); } } public IEnumerator Exit() { // 无 yield break; } } public struct EmoCutState : IState { 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); } bodyModuleSystem.CableSystem.ResetPlug(); var bodyModule=bodyModuleSystem.FindBodyModuleByName("Emo"); if(bodyModule!=null) { bodyModule.GetCutSpriteRenderer().sortingOrder=100; 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); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutEmo); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); } } public struct MemoryCutState : IState { 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); } bodyModuleSystem.CableSystem.ResetPlug(); var bodyModule=bodyModuleSystem.FindBodyModuleByName("Memory"); if(bodyModule!=null) { bodyModule.GetCutSpriteRenderer().sortingOrder=100; 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); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutMemory); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); } } public struct LogicCutState : IState { 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); } //bodyModuleSystem.CableSystem.ResetPlug(); var bodyModule=bodyModuleSystem.FindBodyModuleByName("Logic"); if(bodyModule!=null) { bodyModule.GetCutSpriteRenderer().sortingOrder=100; 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); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutLogic); yield return UIManager.Instance.GetPanel().FadeOutAsync(0.1f); } } }