Files
aibis-dream/Assets/Scripts/FixSystemNew/States/HuoShanFixCues.cs
T

195 lines
8.2 KiB
C#

using System;
using System.Collections;
using AibisDream.Framework;
using AibisDream.UI;
using DG.Tweening;
using UnityEngine;
namespace AibisDream.FixSystem
{
public struct ExpressionCue : IFixSceneCue
{
public FixSceneMode Mode => FixSceneMode.Expression;
public IEnumerator Enter(FixTransition transition)
{
// 获取表达系统
var expressionManager = FixSystemCenter.SystemDic.Get<ExpressionManager>();
// 先切 BodyModule(如果需要)
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 TimelineCenter.Instance.PlayTimelineAsync("透镜/透镜in");
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Expression);
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(0.5f);
expressionManager.OpenView();
// 切换到深度表达相机
yield return CameraKit.Instance.SwitchCamera(CameraEnum.ExpressionDeep);
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(0.5f);
yield return TimelineCenter.Instance.PlayTimelineAsync("火山表达模块/火山表达深入");
BubbleSlotKit.Instance.LoadBubbles(BubbleSlotEnum.Expression);
}
public IEnumerator Exit(FixTransition transition)
{
var expressionManager = FixSystemCenter.SystemDic.Get<ExpressionManager>();
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(0.5f);
// 离开表达深入:保持线缆收起,回到 BodyModule 后由 Yarn DropCable 再放线
FixPanelSystem.GetRepairPanel<CablePanel>()?.PullUpCable();
// 关闭表达系统视图
expressionManager.CloseView();
yield return CameraKit.Instance.SwitchCamera(CameraEnum.Expression);
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(0.5f);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
yield return TimelineCenter.Instance.PlayTimelineAsync("透镜/透镜out");
yield break;
}
}
public struct EmoCue : IFixSceneCue
{
public FixSceneMode Mode => FixSceneMode.Emo;
public IEnumerator Enter(FixTransition transition)
{
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);
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(0.5f);
//emoManager.OpenView();
yield return CameraKit.Instance.SwitchCamera(CameraEnum.EmoDeep);
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(0.5f);
}
public IEnumerator Exit(FixTransition transition)
{
FixPanelSystem.GetRepairPanel<CablePanel>()?.PullUpCable();
yield break;
}
}
public struct AnalysisModeCue : IFixSceneCue
{
public FixSceneMode Mode => FixSceneMode.AnalysisMode;
public IEnumerator Enter(FixTransition transition)
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
var analysisModeManager = FixSystemCenter.SystemDic.Get<MiniGame.Language.AnalysisModeManager>();
// 先切 BodyModule(如果需要)
if (!CameraKit.Instance.EqualToCameraState(CameraEnum.BodyModule))
{
bodyModuleSystem.SwitchModuleGroup(ModuleState.Head);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.BodyModule);
}
FixPanelSystem.GetRepairPanel<CablePanel>()?.PullUpCable();
// 切换到分析模式相机
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(0.5f);
yield return CameraKit.Instance.SwitchCamera(CameraEnum.AnalysisMode);
// 进入分析模式
if (analysisModeManager != null)
{
analysisModeManager.OnEnter();
}
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(0.5f);
}
public IEnumerator Exit(FixTransition transition)
{
float duration = 0.5f;
var analysisModeManager = FixSystemCenter.SystemDic.Get<MiniGame.Language.AnalysisModeManager>();
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(duration);
// 退出分析模式
if (analysisModeManager != null)
{
analysisModeManager.OnExit();
}
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(duration);
}
}
public struct SalesCue : IFixSceneCue
{
public FixSceneMode Mode => FixSceneMode.Sales;
public IEnumerator Enter(FixTransition transition)
{
var bodyModuleSystem = FixSystemCenter.SystemDic.Get<BodyModuleSystem>();
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<AibisDream.MiniGame.Language.SalesManager>();
if (salesManager != null)
{
// FadeIn
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(0.5f);
// 打开销售系统视图,传入systemView参数
salesManager.OpenView();
// FadeOut
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(0.5f);
// 销售模块使用自身的气泡槽位;缺失时再回退到 ScreenSystem,避免读到错误的槽位配置
if (BubbleSlotKit.Instance.TryGet(BubbleSlotEnum.Sales, out _))
{
BubbleSlotKit.Instance.LoadBubbles(BubbleSlotEnum.Sales);
Debug.Log("[SalesCue] Loaded bubble slots from BubbleSlotKit (Sales).");
}
else
{
Debug.LogWarning("[SalesCue] Sales 气泡槽组未注册,回退到 BodyModule。");
BubbleSlotKit.Instance.LoadBubbles(BubbleSlotEnum.BodyModule);
}
}
}
public IEnumerator Exit(FixTransition transition)
{
float duration = 0.5f;
var salesManager = FixSystemCenter.SystemDic.Get<AibisDream.MiniGame.Language.SalesManager>();
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeInAsync(duration);
// 关闭销售系统视图
if (salesManager != null)
{
salesManager.CloseView();
}
// 关闭前先播放钳子放下盖子,完成后再结
yield return UIManager.Instance.GetPanel<ScreenTransitionPanel>().FadeOutAsync(duration);
yield return TimelineCenter.Instance.PlayTimelineAsync("钳子/放下盖子");
yield return null;
}
}
}