feat(fix-system): 重构序章维修流程与面板启动表现

This commit is contained in:
2026-07-16 17:50:35 +08:00
parent 8c37a0bd09
commit 3be0bf8201
12 changed files with 492 additions and 220 deletions
@@ -7,6 +7,12 @@ using DG.Tweening;
namespace AibisDream.FixSystem
{
public enum SystemStartupMode
{
AutoOnHead,
Deferred
}
/// <summary>
/// 维修面板系统 - 统一管理所有侧边栏面板
/// 包括常驻面板(对话、任务)和随状态切换的游戏面板
@@ -57,17 +63,24 @@ namespace AibisDream.FixSystem
[Header("光照系统")]
[SerializeField] private bool isSystemOn = false;
public bool IsSystemOn => isSystemOn;
public bool ShouldAutoStartOnHeadEntry =>
!isSystemOn && (!isStartupPrepared || startupMode == SystemStartupMode.AutoOnHead);
[SerializeField] private FixPanelLight panelLight;
public FixPanelLight PanelLight => panelLight;
private bool isStarting;
private bool isStartupPrepared;
private SystemStartupMode startupMode = SystemStartupMode.AutoOnHead;
private LightState targetLightState = LightState.Normal;
[Header("维修切换管理")]
[SerializeField] private RepairSystemManager repairSystemManager;
public RepairSystemManager RepairSystemManager => repairSystemManager;
private void InitLight()
{
panelLight.Initialize(isSystemOn);
panelLight.Initialize(isSystemOn, targetLightState);
GetRepairPanel<CablePanel>().InitLight(isSystemOn);
// 无光环境下屏幕也不能亮
if (!isSystemOn)
@@ -80,11 +93,36 @@ namespace AibisDream.FixSystem
#region
/// <summary>
/// 为指定剧情准备一次系统启动。只有显式调用该接口的 YarnProject 会改变默认表现。
/// </summary>
public void PrepareSystemStartup(SystemStartupMode mode)
{
startupMode = mode;
isStartupPrepared = true;
targetLightState = LightState.Normal;
ApplySystemOnImmediate(false);
taskPanel?.HidePanelImmediate();
}
/// <summary>
/// 启动所有系统(协调灯光系统和 CablePanel 的启动顺序)
/// </summary>
public IEnumerator StartAllSystems()
{
if (isSystemOn) yield break;
if (isStarting)
{
while (isStarting)
{
yield return null;
}
yield break;
}
isStarting = true;
// 1. 先启动 CablePanel 的系统自检
var cablePanel = GetRepairPanel<CablePanel>();
if (cablePanel != null)
@@ -102,12 +140,27 @@ namespace AibisDream.FixSystem
screenPanel.gameObject.SetActive(true);
isSystemOn = true;
isStarting = false;
isStartupPrepared = false;
// 开机动画使用 Normal 表现,完成后再进入 Yarn 在关机期间缓存的目标状态。
ApplyLightState(targetLightState);
}
/// <summary>
/// 设置灯光状态,并同步更新相关面板的灯光效果
/// </summary>
public void SetLightState(LightState newState)
{
targetLightState = newState;
// 关机时只缓存目标状态,避免序章的 Warning 提前点亮面板。
if (!isSystemOn) return;
ApplyLightState(newState);
}
private void ApplyLightState(LightState newState)
{
// 1. 更新主灯光系统
if (panelLight != null)
@@ -134,6 +187,7 @@ namespace AibisDream.FixSystem
var dto = new FixPanelSnapshotDto
{
isSystemOn = isSystemOn,
lightState = targetLightState.ToString(),
currentRepairSystemType = repairSystemManager?.GetCurrentSystemType()?.Name,
isCableRetracted = cablePanel != null && cablePanel.isCableRetracted
};
@@ -161,6 +215,17 @@ namespace AibisDream.FixSystem
{
if (dto == null) return;
// 读档恢复的是稳定终态,不继承可能仍留在场景中的待启动模式。
isStartupPrepared = false;
startupMode = SystemStartupMode.AutoOnHead;
targetLightState = LightState.Normal;
if (!string.IsNullOrEmpty(dto.lightState)
&& !System.Enum.TryParse(dto.lightState, true, out targetLightState))
{
Debug.LogWarning($"[FixPanelSystem] Unknown saved light state '{dto.lightState}'; using Normal.");
targetLightState = LightState.Normal;
}
ApplySystemOnImmediate(dto.isSystemOn);
if (repairSystemManager != null)
@@ -177,10 +242,11 @@ namespace AibisDream.FixSystem
public void ApplySystemOnImmediate(bool isOn)
{
isSystemOn = isOn;
isStarting = false;
if (panelLight != null)
{
panelLight.Initialize(isOn);
panelLight.Initialize(isOn, targetLightState);
}
var cablePanel = GetRepairPanel<CablePanel>();