From d780ff59ee878d5f49a526573061556127a07914 Mon Sep 17 00:00:00 2001
From: Ding Yuntian <1491671119@qq.com>
Date: Wed, 24 Jun 2026 22:43:39 +0800
Subject: [PATCH] =?UTF-8?q?refactor(fix-system):=20FixPanel=20=E4=B8=8E=20?=
=?UTF-8?q?Cable=20=E8=BF=81=E7=A7=BB=E4=B8=BA=E6=98=BE=E5=BC=8F=E5=BF=AB?=
=?UTF-8?q?=E7=85=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Assets/Scripts/FixSystemNew/Cable/Plug.cs | 26 +++++
.../Screen System/Core/FixPanelSystem.cs | 62 ++++++++++++
.../Screen System/Core/RepairSystemManager.cs | 31 ++++++
.../Screen System/FixPanel/CablePanel.cs | 99 ++++++++++++++-----
4 files changed, 193 insertions(+), 25 deletions(-)
diff --git a/Assets/Scripts/FixSystemNew/Cable/Plug.cs b/Assets/Scripts/FixSystemNew/Cable/Plug.cs
index 490f7d52a..bfde86d9c 100644
--- a/Assets/Scripts/FixSystemNew/Cable/Plug.cs
+++ b/Assets/Scripts/FixSystemNew/Cable/Plug.cs
@@ -94,6 +94,32 @@ namespace AibisDream.FixSystem
OnPullUpSocket?.Invoke();
}
+ /// 读档/静默:仅恢复插头精灵可见,不触发 CablePanel 事件。
+ public void PullUpSocketSilent()
+ {
+ _sprite.enabled = true;
+ }
+
+ /// 读档:无动画回到初始位。
+ public void RestoreAtStartPositionImmediate()
+ {
+ transform.rotation = _defaultRotation;
+ transform.position = _startPos;
+ }
+
+ /// 读档:无动画插入指定 socket 的视觉终态。
+ public void RestoreInsertedAt(Transform socketPos)
+ {
+ if (socketPos == null) return;
+ transform.position = socketPos.position;
+ _sprite.enabled = false;
+ }
+
+ public void SetSpriteVisible(bool visible)
+ {
+ _sprite.enabled = visible;
+ }
+
private void OnDrag(BaseEventData eventData)
{
if (!_isDragging) return;
diff --git a/Assets/Scripts/FixSystemNew/Screen System/Core/FixPanelSystem.cs b/Assets/Scripts/FixSystemNew/Screen System/Core/FixPanelSystem.cs
index 84c838a88..aca70f4a1 100644
--- a/Assets/Scripts/FixSystemNew/Screen System/Core/FixPanelSystem.cs
+++ b/Assets/Scripts/FixSystemNew/Screen System/Core/FixPanelSystem.cs
@@ -1,5 +1,6 @@
using AibisDream.Framework;
using AibisDream.Kit;
+using AibisDream.SaveSystem;
using UnityEngine;
using System.Collections;
using DG.Tweening;
@@ -125,6 +126,67 @@ namespace AibisDream.FixSystem
#endregion
+ #region 快照 Capture / Restore
+
+ public FixPanelSnapshotDto CapturePanelSnapshot()
+ {
+ var cablePanel = GetRepairPanel();
+ var dto = new FixPanelSnapshotDto
+ {
+ isSystemOn = isSystemOn,
+ currentRepairSystemType = repairSystemManager?.GetCurrentSystemType()?.Name,
+ isCableRetracted = cablePanel != null && cablePanel.isCableRetracted
+ };
+
+ if (cablePanel != null && cablePanel.TryGetPluggedModuleName(out var moduleName))
+ {
+ dto.pluggedModuleName = moduleName;
+ }
+
+ if (dto.isCableRetracted && !string.IsNullOrEmpty(dto.pluggedModuleName))
+ {
+ Debug.LogWarning("[FixPanelSystem] Capture: isCableRetracted 与 pluggedModuleName 冲突,忽略 pluggedModuleName。");
+ dto.pluggedModuleName = null;
+ }
+
+ return dto;
+ }
+
+ public void ApplyPanelSnapshot(FixPanelSnapshotDto dto)
+ {
+ if (dto == null) return;
+
+ ApplySystemOnImmediate(dto.isSystemOn);
+
+ if (repairSystemManager != null)
+ {
+ repairSystemManager.RestoreSystemType(dto.currentRepairSystemType);
+ }
+
+ GetRepairPanel()?.ApplyCableSnapshot(dto.isCableRetracted, dto.pluggedModuleName);
+ }
+
+ /// 读档终态:跳过 StartAllSystems 动画,直接写面板壳层状态。
+ public void ApplySystemOnImmediate(bool isOn)
+ {
+ isSystemOn = isOn;
+
+ if (panelLight != null)
+ {
+ panelLight.Initialize(isOn);
+ }
+
+ var cablePanel = GetRepairPanel();
+ cablePanel?.InitLight(isOn);
+
+ if (screenPanel != null)
+ {
+ screenPanel.gameObject.SetActive(isOn);
+ }
+ }
+
+ #endregion
+
#region 屏幕相关操作
[Header("默认画布")]
[SerializeField] private Canvas canvas;
diff --git a/Assets/Scripts/FixSystemNew/Screen System/Core/RepairSystemManager.cs b/Assets/Scripts/FixSystemNew/Screen System/Core/RepairSystemManager.cs
index fee5b4153..36e0ba7b6 100644
--- a/Assets/Scripts/FixSystemNew/Screen System/Core/RepairSystemManager.cs
+++ b/Assets/Scripts/FixSystemNew/Screen System/Core/RepairSystemManager.cs
@@ -212,6 +212,37 @@ namespace AibisDream.FixSystem
: null;
}
+ /// 读档:按已注册类型名切换中央维修视图(无动画)。
+ public void RestoreSystemType(string typeName)
+ {
+ Type targetType = typeof(BodyModuleSystem);
+
+ if (!string.IsNullOrEmpty(typeName))
+ {
+ Type matched = null;
+ foreach (var kv in _registeredSystems)
+ {
+ if (kv.Key.Name == typeName)
+ {
+ matched = kv.Key;
+ break;
+ }
+ }
+
+ if (matched != null)
+ {
+ targetType = matched;
+ }
+ else
+ {
+ Debug.LogWarning($"[RepairSystemManager] 未找到已注册系统: {typeName},保持当前类型。");
+ return;
+ }
+ }
+
+ SwitchSystem(targetType);
+ }
+
#endregion
}
}
diff --git a/Assets/Scripts/FixSystemNew/Screen System/FixPanel/CablePanel.cs b/Assets/Scripts/FixSystemNew/Screen System/FixPanel/CablePanel.cs
index 9e3c1b7d8..e5b753437 100644
--- a/Assets/Scripts/FixSystemNew/Screen System/FixPanel/CablePanel.cs
+++ b/Assets/Scripts/FixSystemNew/Screen System/FixPanel/CablePanel.cs
@@ -14,7 +14,6 @@ namespace AibisDream.FixSystem
public class CablePanel : MonoBehaviour, IOperatorPanel
{
- private const string CableRetractedKey = "$global.cableRetracted";
private const int SortingOrderRetracted = 41;
#region 组件索引
@@ -52,9 +51,8 @@ namespace AibisDream.FixSystem
private void Start()
{
InitComponentRefs();
-
InitSystem();
- LoadCableState();
+ InitCableVisualFromPrefab();
}
private void OnDestroy()
@@ -82,37 +80,90 @@ namespace AibisDream.FixSystem
plugRef.OnPlugPointerDown += OnPlugPoinerDown;
}
- private void LoadCableState()
+ private void InitCableVisualFromPrefab()
{
- // 从Prefab读取
if (isCableRetracted)
{
SetRetractCable();
}
else
{
- PlugRef.ReturnToStartPosition();
- }
-
- // 从存储系统读取
- if (!YarnVariableStorage.Instance.TryGetValue(CableRetractedKey, out bool savedRetractedState))
- return;
-
- if (savedRetractedState)
- {
- SetRetractCable();
- }
- else
- {
- if (isCableRetracted)
- DropDownCable();
+ DropDownCableImmediate();
}
}
- private void SaveCableState()
+ public bool TryGetPluggedModuleName(out string moduleName)
{
- Debug.Log("Save cableRetractedstate" + isCableRetracted);
- YarnVariableStorage.Instance.SetValue(CableRetractedKey, isCableRetracted);
+ if (curSocket is BodyModule bodyModule)
+ {
+ moduleName = bodyModule.data.moduleName;
+ return !string.IsNullOrEmpty(moduleName);
+ }
+
+ moduleName = null;
+ return false;
+ }
+
+ /// 读档:同步写回线缆与插头终态,无动画、无 Yarn、无 PlugIn 事件。
+ public void ApplyCableSnapshot(bool retracted, string pluggedModuleName)
+ {
+ SilentPullUpSocket();
+
+ if (retracted)
+ {
+ SetRetractCable();
+ curSocket = null;
+ return;
+ }
+
+ DropDownCableImmediate();
+
+ if (!string.IsNullOrEmpty(pluggedModuleName))
+ {
+ RestorePlugToModule(pluggedModuleName);
+ }
+ else
+ {
+ curSocket = null;
+ SetCableMode(CableMode.Physic);
+ }
+ }
+
+ public void DropDownCableImmediate()
+ {
+ PlugRef.PullUpSocketSilent();
+ CableReelRef.ResetRotation();
+ PlugRef.RestoreAtStartPositionImmediate();
+ SetCableMode(CableMode.Physic);
+ isCableRetracted = false;
+ }
+
+ private void RestorePlugToModule(string moduleName)
+ {
+ var module = BodyModuleSystem?.FindBodyModuleByName(moduleName);
+ if (module == null)
+ {
+ Debug.LogWarning($"[CablePanel] RestorePlugToModule: 未找到模块 {moduleName},插头留在初始位。");
+ curSocket = null;
+ SetCableMode(CableMode.Physic);
+ return;
+ }
+
+ curSocket = module;
+ var socketPos = module.GetSocketPos();
+ PlugRef.RestoreInsertedAt(socketPos);
+ CableRef.SetEndPos(socketPos);
+ BodyModuleSystem.CloseModuleSlots(null);
+ }
+
+ private void SilentPullUpSocket()
+ {
+ if (curSocket == null) return;
+
+ CableRef.SetEndPos(PlugRef.PlugRoot);
+ curSocket.PlugOut();
+ curSocket = null;
+ PlugRef.SetSpriteVisible(true);
}
private void Update()
@@ -245,7 +296,6 @@ namespace AibisDream.FixSystem
{
ApplyRetractedState();
isCableRetracted = true;
- SaveCableState();
});
AudioManager.Instance.PlaySfx("event:/ActionFB/mods_close");
@@ -262,7 +312,6 @@ namespace AibisDream.FixSystem
{
SetCableMode(CableMode.Physic);
isCableRetracted = false;
- SaveCableState();
});
}