diff --git a/Assets/Scripts/Game/GameElements/Notes/NoteObjects/NoteBase.cs b/Assets/Scripts/Game/GameElements/Notes/NoteObjects/NoteBase.cs index 11518a80..3cbedd8b 100644 --- a/Assets/Scripts/Game/GameElements/Notes/NoteObjects/NoteBase.cs +++ b/Assets/Scripts/Game/GameElements/Notes/NoteObjects/NoteBase.cs @@ -104,6 +104,46 @@ namespace Ichni.RhythmGame GameManager.Instance.noteManager.RegisterNote(this, exactJudgeTime - beyondTime - 0.5f); } } + + /// + /// 当 NoteVisual 被动态挂载或替换后,重新缓存效果列表并刷新 NoteManager 注册。 + /// + public void RefreshNoteVisualCaches() + { + generateEffects = GetEffectListSafe("Generate"); + generalJudgeEffects = GetEffectListSafe("GeneralJudge"); + perfectEffects = GetEffectListSafe("Perfect"); + goodEffects = GetEffectListSafe("Good"); + badEffects = GetEffectListSafe("Bad"); + missEffects = GetEffectListSafe("Miss"); + afterJudgeEffects = GetEffectListSafe("AfterJudge"); + + float beyondTime = 0f; + if (generateEffects != null) + { + for (int i = 0; i < generateEffects.Count; i++) + { + EffectBase effectBase = generateEffects[i]; + if (effectBase is NoteGenerateEffect ge) + { + ge.nowEffectState = EffectBase.EffectState.Before; + ge.Recover(); + beyondTime = Mathf.Max(beyondTime, ge.generateTime); + } + else + { + effectBase.nowEffectState = EffectBase.EffectState.Before; + effectBase.Recover(); + } + } + } + + if (exactJudgeTime - beyondTime - 0.5f > -GameManager.Instance.songInformation.delay) + { + gameObject.SetActive(false); + GameManager.Instance.noteManager.RegisterNote(this, exactJudgeTime - beyondTime - 0.5f); + } + } #endregion #region [轮询更新] Main Update & Visual Calculate diff --git a/Assets/Scripts/Game/GameElements/Notes/NoteVisual/NoteVisualBase.cs b/Assets/Scripts/Game/GameElements/Notes/NoteVisual/NoteVisualBase.cs index 29064bcf..e4c71db3 100644 --- a/Assets/Scripts/Game/GameElements/Notes/NoteVisual/NoteVisualBase.cs +++ b/Assets/Scripts/Game/GameElements/Notes/NoteVisual/NoteVisualBase.cs @@ -47,6 +47,19 @@ namespace Ichni.RhythmGame base.SetDefaultSubmodules(); effectSubmodule = new EffectSubmodule(this, EffectSubmodule.EffectSubmodulePreset.Note); } + + /// + /// NoteVisual 初始化完毕后,通知父 Note 重新缓存效果列表。 + /// + public override void AfterInitialize() + { + base.AfterInitialize(); + + if (note != null) + { + note.RefreshNoteVisualCaches(); + } + } #endregion #region [行为重写] Behavior Overrides @@ -59,6 +72,18 @@ namespace Ichni.RhythmGame { } + + public override void OnDelete() + { + base.OnDelete(); + + // 清除父 Note 对已删除 NoteVisual 的引用,防止悬空引用和 NullReferenceException + if (note != null) + { + note.noteVisual = null; + note.RefreshNoteVisualCaches(); + } + } #endregion }