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(); }); }