Files
aibis-dream/Assets/Scripts/FixSystemNew/FixStateMachine.cs
T

446 lines
15 KiB
C#

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 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();
_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(),
_ => new ClinicState()
};
res.SetArgs(args);
return res;
}
}
public enum FixState
{
Default,
Clinic,
BodyModule,
Memory,
Eye,
UF,
Expression,
Engine,
Gear,
Emo
}
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
{
private string _args;
public FixState GetState => FixState.BodyModule;
public void SetArgs(string args)
{
// 设置参数
_args = args;
}
public IEnumerator Enter()
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
// 拔出插头
bodyModuleSystem.ResetPlug();
// 切换Body或Head
if (Enum.TryParse<ModuleState>(_args, out var moduleState))
{
bodyModuleSystem.SwitchModuleGroup(moduleState);
}
// 切换相机
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))
{
// 先切BodyModule
var bodyModule = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
bodyModule.SwitchModuleGroup(ModuleState.Body);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(0.5f);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(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()
{
// 先切BodyModule
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
var bodyModule = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
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>();
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<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);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(0.5f);
ufSystem.OpenUFView();
yield return CameraKit.Instance.SwitchCamera(CameraEnum.EyeDeep);
eyeSystem.OnEnter();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(0.5f);
}
public IEnumerator Exit()
{
float duration = 0.5f;
var ufSystem = FixSystemCenter.SystemDic.Get<UFSystem>();
var eyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(duration);
eyeSystem.OnExit();
ufSystem.CloseUFView();
yield return CameraKit.Instance.SwitchCamera(CameraEnum.UF);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().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<BodyModuleSystem>();
var eyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
// 先切BodyModule
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
}
//打开盖子
SpriteRenderer sp = bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Cover")
.GetComponent<SpriteRenderer>();
sp.sprite = Resources.Load<Sprite>("Art/Fix/Peipei/Eye/视觉模块盖子打开A");
yield return new WaitForSeconds(0.1f);
sp.sprite = Resources.Load<Sprite>("Art/Fix/Peipei/Eye/视觉模块盖子打开B");
// 插头回到初始插孔
bodyModuleSystem.ResetPlug();
// 切换相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Eye);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(0.5f);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.EyeDeep);
eyeSystem.OnEnter();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(0.5f);
}
public IEnumerator Exit()
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
float duration = 0.5f;
var eyeSystem = FixSystemCenter.SystemDic.Get<EyeSystem>();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(duration);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Eye);
eyeSystem.OnExit();
yield return new WaitForSeconds(0.1f);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(duration);
//关上
SpriteRenderer sp = bodyModuleSystem.FindBodyModuleByName("Eye").transform.Find("Cover")
.GetComponent<SpriteRenderer>();
sp.sprite = Resources.Load<Sprite>("Art/Fix/Peipei/Eye/视觉模块盖子打开A");
yield return new WaitForSeconds(0.1f);
sp.sprite = Resources.Load<Sprite>("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<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 UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(duration);
memorySystem.OnEnter();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(duration);
}
public IEnumerator Exit()
{
float duration = 0.5f;
var memorySystem = FixSystemCenter.SystemDic.Get<MemoryProcess>();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(duration);
memorySystem.OnExit();
memorySystem.CloseMemoryView();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().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<ExpressionManager>();
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
var bodyModule = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
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<PlayToolPanel>().FadeInAsync(0.5f);
//expressionManager.OpenView();
yield return CameraKit.Instance.SwitchCamera(CameraEnum.ExpressionDeep);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(0.5f);
}
public IEnumerator Exit()
{
var expressionManager = FixSystemCenter.SystemDic.Get<ExpressionManager>();
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
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<EmoManager>();
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
var bodyModule = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
bodyModule.SwitchModuleGroup(ModuleState.Head);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
}
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Emo);
emoManager.OpenView();
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeInAsync(0.5f);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.EmoDeep);
yield return UIManager.Instance.GetPanel<PlayToolPanel>().FadeOutAsync(0.5f);
}
public IEnumerator Exit()
{
var emoManager = FixSystemCenter.SystemDic.Get<EmoManager>();
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
bodyModuleSystem.ResetPlug();
emoManager.CloseView();
yield break;
}
}
}