using System; using System.Collections; using AibisDream.Framework; using UnityEngine; namespace AibisDream.FixSystem { public class FixStateMachine { public FixState CurState => _curState.GetState; private IState _curState; private string _curArgs; public IEnumerator SwitchState(FixState nextState, string args = "") { _curArgs = args; yield return _curState?.Exit(); GameLoopManager.Instance?.UpdateFixState(nextState, _curArgs); _curState = CreateState(nextState, _curArgs); yield return _curState.Enter(); } public IEnumerator QuitState() { _curArgs = null; yield return _curState?.Exit(); GameLoopManager.Instance?.UpdateFixState(FixState.Default, _curArgs); _curState = null; } private static IState CreateState(FixState nextState, string args) { IState res = nextState switch { FixState.Clinic => new ClinicState(), FixState.Engine => new EngineState(), FixState.CoolingMachine => new CoolingMachineState(), FixState.BodyModule => new BodyModuleState(), FixState.Memory => new MemoryState(), FixState.Eye => new EyeState(), FixState.UF => new UfState(), FixState.Gear => new GearState(), _ => new ClinicState() }; res.SetArgs(args); return res; } } public enum FixState { Default, Clinic, CoolingMachine, BodyModule, Memory, Eye, UF, Engine, Gear } 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(FixState.Clinic); } public IEnumerator Exit() { // 无 yield break; } } public struct BodyModuleState : IState { public FixState GetState => FixState.BodyModule; public void SetArgs(string args) { // 无 } public IEnumerator Enter() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); // 拔出插头 bodyModuleSystem.ResetPlug(); // 切换相机 yield return CameraKit.Instance.SwitchCamera(FixState.BodyModule); } public IEnumerator Exit() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); // 拔出插头 bodyModuleSystem.ResetPlug(); 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(FixState.BodyModule)) { yield return MainUIController.Instance?.FadeInSync(0.5f); yield return CameraKit.Instance.SwitchCamera(FixState.BodyModule); yield return MainUIController.Instance?.FadeOutSync(0.5f); } // 切换相机 yield return CameraKit.Instance.SwitchCamera(FixState.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(FixState.BodyModule)) { //yield return MainUIController.Instance?.FadeInSync(0.5f); yield return CameraKit.Instance.SwitchCamera(FixState.BodyModule); //yield return MainUIController.Instance?.FadeOutSync(0.5f); } // 切换相机 yield return CameraKit.Instance.SwitchCamera(FixState.Engine); } public IEnumerator Exit() { var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); bodyModuleSystem.ResetPlug(); yield break; } } public struct CoolingMachineState : IState { private bool _playLink; public FixState GetState => FixState.CoolingMachine; public void SetArgs(string args) { _playLink = !string.IsNullOrEmpty(args); } public IEnumerator Enter() { var coolingSystem = FixSystemCenter.SystemDic.Get(); // 切相机 yield return CameraKit.Instance.SwitchCamera(FixState.CoolingMachine); // 打开泵机 coolingSystem.gameObject.SetActive(true); yield return coolingSystem.OpenCoolingSystem(); // 播放插线动画 if (_playLink) { yield return coolingSystem.LinkTube(); } } public IEnumerator Exit() { var cooling = FixSystemCenter.SystemDic.Get(); yield return cooling.CloseBottleUI(); yield return cooling.CloseCoolingSystem(); yield return new WaitForSeconds(1f); } } public struct UfState : IState { public FixState GetState => FixState.UF; public void SetArgs(string args) { } public IEnumerator Enter() { float duration = 0.5f; var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var UFSystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(FixState.BodyModule)) { yield return MainUIController.Instance?.FadeInSync(0.5f); yield return CameraKit.Instance.SwitchCamera(FixState.BodyModule); yield return MainUIController.Instance?.FadeOutSync(0.5f); } // 插头回到初始插孔 bodyModuleSystem.ResetPlug(); // 切换相机 yield return CameraKit.Instance.SwitchCamera(FixState.UF); yield return MainUIController.Instance.FadeInSync(duration); UFSystem.OpenUFView(); yield return MainUIController.Instance.FadeOutSync(duration); } public IEnumerator Exit() { var eyeSystem = FixSystemCenter.SystemDic.Get(); eyeSystem.OnExit(); yield return null; } } public struct EyeState : IState { public FixState GetState => FixState.Eye; public void SetArgs(string args) { } public IEnumerator Enter() { float duration = 0.5f; var bodyModuleSystem = FixSystemCenter.SystemDic.Get(); var eyeSystem = FixSystemCenter.SystemDic.Get(); // 先切BodyModule if (!CameraKit.Instance.EqualToCameraState(FixState.BodyModule)) { yield return MainUIController.Instance?.FadeInSync(0.5f); yield return CameraKit.Instance.SwitchCamera(FixState.BodyModule); yield return MainUIController.Instance?.FadeOutSync(0.5f); } //打开盖子 bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Module Pic").GetComponent().sprite=Resources.Load("Art/Fix/Peipei/视觉盖子打开"); // 插头回到初始插孔 bodyModuleSystem.ResetPlug(); // 切换相机 yield return CameraKit.Instance.SwitchCamera(FixState.Eye); yield return MainUIController.Instance.FadeInSync(duration); eyeSystem.OnEnter(); yield return MainUIController.Instance.FadeOutSync(duration); } public IEnumerator Exit() { var eyeSystem = FixSystemCenter.SystemDic.Get(); eyeSystem.OnExit(); 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(FixState.BodyModule)) { yield return MainUIController.Instance?.FadeInSync(0.5f); yield return CameraKit.Instance.SwitchCamera(FixState.BodyModule); yield return MainUIController.Instance?.FadeOutSync(0.5f); } yield return memorySystem.DropMemoryProjector(); // 插头回到初始插孔 bodyModuleSystem.ResetPlug(); // 相机聚焦到目标位 yield return CameraKit.Instance.SwitchCamera(FixState.Memory); yield return MainUIController.Instance.FadeInSync(duration); memorySystem.OnEnter(); yield return MainUIController.Instance.FadeOutSync(duration); } public IEnumerator Exit() { var memorySystem = FixSystemCenter.SystemDic.Get(); memorySystem.OnExit(); yield return MainUIController.Instance.FadeOutSync(0.5f); } } }