diff --git a/Assets/Scripts/FixSystemNew/BodyModule/BodyModuleSystem.cs b/Assets/Scripts/FixSystemNew/BodyModule/BodyModuleSystem.cs index 2a236fa8c..ee0a0c6cb 100644 --- a/Assets/Scripts/FixSystemNew/BodyModule/BodyModuleSystem.cs +++ b/Assets/Scripts/FixSystemNew/BodyModule/BodyModuleSystem.cs @@ -343,6 +343,21 @@ namespace AibisDream.FixSystem _moduleState = moduleState; } + /// + /// 进入切割特写时,按各模块当前 ModuleCondition 同步所有模块的 CutText 亮灭, + /// 保证特写里每个模块文字都与舱外一致——而不只是被切割的目标模块。 + /// + public void SyncAllCutTextsFromCondition() + { + if (BodyModules == null) return; + + foreach (var module in BodyModules) + { + if (module != null) + module.ApplyCutTextFromCondition(); + } + } + /// /// 从模块中清除 /// diff --git a/Assets/Scripts/FixSystemNew/BodyModule/ModuleConditionVisual.cs b/Assets/Scripts/FixSystemNew/BodyModule/ModuleConditionVisual.cs index a354fb30f..dd6099524 100644 --- a/Assets/Scripts/FixSystemNew/BodyModule/ModuleConditionVisual.cs +++ b/Assets/Scripts/FixSystemNew/BodyModule/ModuleConditionVisual.cs @@ -49,6 +49,11 @@ namespace AibisDream.FixSystem public bool IsConfigured => modulePicRenderer != null && moduleTextRenderer != null; + /// + /// 文字当前的亮/灭状态(含 Damaged 闪烁中的瞬时相位),供切割视图入场时对齐。 + /// + public bool IsTextCurrentlyVisible => moduleTextRenderer != null && moduleTextRenderer.enabled; + private void Awake() { Initialize(); diff --git a/Assets/Scripts/FixSystemNew/BodyModule/Modules/BodyModule.cs b/Assets/Scripts/FixSystemNew/BodyModule/Modules/BodyModule.cs index a2d5f10ac..7a9eef803 100644 --- a/Assets/Scripts/FixSystemNew/BodyModule/Modules/BodyModule.cs +++ b/Assets/Scripts/FixSystemNew/BodyModule/Modules/BodyModule.cs @@ -245,6 +245,10 @@ namespace AibisDream.FixSystem /// public void ApplyCutTextFromCondition() { + // 没有独立 CutText 的模块(如无特写文字的模块)直接跳过,避免起无效闪烁协程。 + if (_cutTextRenderer == null) + return; + StopCutTextFlicker(restoreVisible: false); switch (condition) @@ -253,7 +257,9 @@ namespace AibisDream.FixSystem SetCutTextVisible(true); break; case ModuleCondition.Damaged: - SetCutTextVisible(true); + // 与舱外文字当前的瞬时亮灭相位对齐,而非固定为常亮,避免入场瞬间闪烁不同步 + bool currentlyVisible = conditionVisual == null || conditionVisual.IsTextCurrentlyVisible; + SetCutTextVisible(currentlyVisible); StartCutTextFlicker(); break; case ModuleCondition.PoweredOff: diff --git a/Assets/Scripts/FixSystemNew/States/CutFixCues.cs b/Assets/Scripts/FixSystemNew/States/CutFixCues.cs index 978a4a257..28476e628 100644 --- a/Assets/Scripts/FixSystemNew/States/CutFixCues.cs +++ b/Assets/Scripts/FixSystemNew/States/CutFixCues.cs @@ -32,9 +32,9 @@ namespace AibisDream.FixSystem bodyModule.GetCutSpriteRenderer().color = new Color(1f, 1f, 1f, 1f); bodyModule.GetCutSpriteRenderer().GetComponentInChildren().color = new Color(1f, 1f, 1f, 1f); - // 相机切入前先对齐 CutText,避免过渡期间亮灭与舱外不一致 - bodyModule.ApplyCutTextFromCondition(); } + // 相机切入前对齐所有模块的 CutText(不只是目标模块),避免特写里其它模块文字亮灭与舱外不一致 + bodyModuleSystem.SyncAllCutTextsFromCondition(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutEmo); yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); @@ -79,9 +79,9 @@ namespace AibisDream.FixSystem bodyModule.GetCutSpriteRenderer().color = new Color(1f, 1f, 1f, 1f); bodyModule.GetCutSpriteRenderer().GetComponentInChildren().color = new Color(1f, 1f, 1f, 1f); - // 相机切入前先对齐 CutText,避免过渡期间亮灭与舱外不一致 - bodyModule.ApplyCutTextFromCondition(); } + // 相机切入前对齐所有模块的 CutText(不只是目标模块),避免特写里其它模块文字亮灭与舱外不一致 + bodyModuleSystem.SyncAllCutTextsFromCondition(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutMemory); yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f); @@ -125,9 +125,9 @@ namespace AibisDream.FixSystem bodyModule.GetCutSpriteRenderer().color = new Color(1f, 1f, 1f, 1f); bodyModule.GetCutSpriteRenderer().GetComponentInChildren().color = new Color(1f, 1f, 1f, 1f); - // 相机切入前先对齐 CutText,避免过渡期间亮灭与舱外不一致 - bodyModule.ApplyCutTextFromCondition(); } + // 相机切入前对齐所有模块的 CutText(不只是目标模块),避免特写里其它模块文字亮灭与舱外不一致 + bodyModuleSystem.SyncAllCutTextsFromCondition(); yield return CameraKit.Instance.SwitchCamera(CameraEnum.CutLogic); yield return UIManager.Instance.GetPanel().FadeInAsync(0.1f);