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
}