feat(open): 支持按记忆模块切换电击闪烁图

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-25 19:47:57 +08:00
co-authored by Cursor
parent 783ef340f5
commit 0d40b8db14
6 changed files with 89 additions and 21 deletions
@@ -26,7 +26,10 @@ public class ShockSystem : MonoBehaviour, IInteraction
[SerializeField] private SpriteRenderer flashHeadSpriteRenderer; // 头部闪烁精灵渲染器
[SerializeField] private SpriteRenderer flashBackgroundSpriteRenderer; // 背景闪烁精灵渲染器
[SerializeField] private SpriteRenderer flashSpriteRenderer;
[SerializeField] private List<Sprite> flashHeadSprites; // 头部闪烁精灵列表
[SerializeField] private List<Sprite> flashHeadSprites; // 当前生效的头部闪烁精灵列表(运行时由两套资源切换)
[SerializeField] private List<Sprite> flashHeadSpritesWithMemory; // 切割记忆模块前:带记忆模块
[SerializeField] private List<Sprite> flashHeadSpritesWithoutMemory; // 切割记忆模块后:不带记忆模块
[SerializeField] private bool useMemoryModuleFlashSprites = true; // 是否使用带记忆模块的电击图
[SerializeField] private SpriteFlashSystem spriteFlashSystem; // Sprite闪烁系统
[SerializeField] private GameObject sparkEffect1; // 火花特效1
[SerializeField] private GameObject sparkEffect2; // 火花特效2
@@ -202,6 +205,45 @@ public class ShockSystem : MonoBehaviour, IInteraction
// 确保火花效果初始状态为关闭
if (sparkEffect1 != null) sparkEffect1.SetActive(false);
if (sparkEffect2 != null) sparkEffect2.SetActive(false);
ApplyFlashHeadSpriteSet(useMemoryModuleFlashSprites);
}
/// <summary>
/// 切换电击闪烁用的头部图集:切割记忆模块前用带模块图,切后用不带模块图。
/// </summary>
public void SetUseMemoryModuleFlashSprites(bool useMemoryModule)
{
ApplyFlashHeadSpriteSet(useMemoryModule);
}
private void ApplyFlashHeadSpriteSet(bool useMemoryModule)
{
useMemoryModuleFlashSprites = useMemoryModule;
var source = useMemoryModule ? flashHeadSpritesWithMemory : flashHeadSpritesWithoutMemory;
if (source != null && source.Count > 0)
{
flashHeadSprites = source;
}
#if UNITY_EDITOR
else
{
Debug.LogWarning(
$"[ShockSystem] {(useMemoryModule ? "" : "")}电击闪烁图列表为空,仍使用当前 flashHeadSprites。",
this);
}
#endif
}
/// <summary>
/// 按 Yarn $gameStage 同步图集:1–2 带记忆模块,≥3(已切除)不带。兼容读档。
/// </summary>
private void SyncFlashSpritesFromYarnState()
{
var storage = YarnVariableStorage.Instance;
if (storage == null) return;
if (!storage.TryGetValue("$gameStage", out float stage)) return;
ApplyFlashHeadSpriteSet(stage < 3f);
}
private void Update()
@@ -426,6 +468,8 @@ public class ShockSystem : MonoBehaviour, IInteraction
public IEnumerator StartShock()
{
SyncFlashSpritesFromYarnState();
// 移动左右电击装置到各自的目标位置
var moveLeft = leftShockDevice.DOLocalMove(leftShockDeviceTargetPos, moveDuration);
var moveRight = rightShockDevice.DOLocalMove(rightShockDeviceTargetPos, moveDuration);
@@ -549,6 +593,8 @@ public class ShockSystem : MonoBehaviour, IInteraction
public IEnumerator PlayFlashEffect()
{
SyncFlashSpritesFromYarnState();
if (flashSequence != null)
{
flashSequence.Kill();