Files
aibis-dream/Assets/Scripts/FixSystemNew/FixStateMachine.cs
T
2025-03-07 15:11:58 +08:00

380 lines
12 KiB
C#

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 FixStateMachine()
{
// 初始化为一个默认状态
_curState = CreateState(FixState.Default, "");
}
/// <summary>
/// 播放诊所到场景的timeline
/// </summary>
/// <returns></returns>
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();
GameLoopManager.Instance?.UpdateFixState(nextState, _curArgs);
_curState = CreateState(nextState, _curArgs);
EnumEventSystem.Global.Send(EventEnum.FixStateSwitch, nextState);
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(CameraEnum.CoolingMachine);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.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>();
// 拔出插头
bodyModuleSystem.ResetPlug();
// 切换相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
// 开启交互
bodyModuleSystem.EnableSystem();
}
public IEnumerator Exit()
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
// 拔出插头
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))
{
yield return MainUIController.Instance?.FadeInSync(0.5f);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
yield return MainUIController.Instance?.FadeOutSync(0.5f);
}
// 切换相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Gear);
// 加载关卡数据
if (!string.IsNullOrEmpty(_configKey))
{
var gearSystem = FixSystemCenter.SystemDic.Get<GearSystem>();
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()
{
var engineSystem = FixSystemCenter.SystemDic.Get<EngineSystem>();
// 先切BodyModule
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
}
// 切换相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Engine);
}
public IEnumerator Exit()
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
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<CoolingSystem>();
// 切相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.CoolingMachine);
// 打开泵机
coolingSystem.gameObject.SetActive(true);
yield return coolingSystem.OpenCoolingSystem();
// 播放插线动画
if (_playLink)
{
yield return coolingSystem.LinkTube();
}
}
public IEnumerator Exit()
{
var cooling = FixSystemCenter.SystemDic.Get<CoolingSystem>();
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()
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
var UFSystem = FixSystemCenter.SystemDic.Get<UFSystem>();
var EyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
// 先切BodyModule
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
}
// 插头回到初始插孔
bodyModuleSystem.ResetPlug();
// 切换相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.UF);
UFSystem.OpenUFView();
EyeSystem.OnEnter();
}
public IEnumerator Exit()
{
var UFSystem = FixSystemCenter.SystemDic.Get<UFSystem>();
var eyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
eyeSystem.OnExit();
UFSystem.CloseUFView();
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<BodyModuleSystem>();
var eyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
// 先切BodyModule
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
}
//打开盖子
bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Module Pic").GetComponent<SpriteRenderer>()
.sprite = Resources.Load<Sprite>("Art/Fix/Peipei/视觉盖子打开");
// 插头回到初始插孔
bodyModuleSystem.ResetPlug();
// 切换相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Eye);
yield return MainUIController.Instance?.FadeInSync(0.5f);
eyeSystem.OnEnter();
yield return MainUIController.Instance?.FadeOutSync(0.5f);
}
public IEnumerator Exit()
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
float duration = 0.5f;
var eyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
yield return MainUIController.Instance.FadeInSync(duration);
eyeSystem.OnExit();
//关上
bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Module Pic").GetComponent<SpriteRenderer>()
.sprite = Resources.Load<Sprite>("Art/Fix/Peipei/视觉盖子关闭");
yield return MainUIController.Instance.FadeOutSync(duration);
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<BodyModuleSystem>();
var memorySystem = FixSystemCenter.SystemDic.Get<MemoryProcess>();
// 先切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 MainUIController.Instance?.FadeInSync(0.5f);
memorySystem.OnEnter();
yield return MainUIController.Instance.FadeOutSync(duration);
}
public IEnumerator Exit()
{
float duration = 0.5f;
var memorySystem = FixSystemCenter.SystemDic.Get<MemoryProcess>();
yield return MainUIController.Instance.FadeInSync(duration);
memorySystem.OnExit();
memorySystem.CloseMemoryView();
yield return MainUIController.Instance.FadeOutSync(duration);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
memorySystem.PullMemoryProjector();
}
}
}