展前冒死重构
This commit is contained in:
@@ -5,6 +5,23 @@ public class Note : BaseNote
|
||||
{
|
||||
private KeyCode keyToPress;
|
||||
private string noteColor;
|
||||
|
||||
// 获取用于生成判定 prefab 的颜色。如果 noteColor 为空(初始化异常),从 TrackIndex 推导兜底。
|
||||
private string GetColorForPrefab()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(noteColor)) return noteColor;
|
||||
|
||||
if (TrackIndex >= 0 && TrackIndex < 5)
|
||||
{
|
||||
string[] trackColors = { "red", "green", "yellow", "purple", "blue" };
|
||||
string fallback = trackColors[TrackIndex];
|
||||
if (JudgeManager.IsDebugEnabled) Debug.LogWarning($"[Note] noteColor was null, using trackIndex {TrackIndex} -> {fallback}");
|
||||
return fallback;
|
||||
}
|
||||
|
||||
Debug.LogError($"[Note] Cannot derive color: noteColor is null and TrackIndex {TrackIndex} is invalid");
|
||||
return null;
|
||||
}
|
||||
private AnimationController anim;
|
||||
private NoteController controller;
|
||||
private bool isJudged = false;
|
||||
@@ -233,10 +250,13 @@ public class Note : BaseNote
|
||||
}
|
||||
|
||||
// Force miss if we've passed the deadline without being judged
|
||||
if (!isJudged && GameplayClock.NowSongTime > missDeadlineTime && gameObject.activeSelf)
|
||||
if (!isJudged && gameObject.activeSelf)
|
||||
{
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note] {noteColor} on track {TrackIndex} exceeded miss deadline at time {GameplayClock.NowSongTime:F3}, forcing Miss");
|
||||
JudgeMiss();
|
||||
if (GameplayClock.NowSongTime >= missDeadlineTime)
|
||||
{
|
||||
Debug.Log($"[Note.Update] Forcing miss for {noteColor} on track {TrackIndex}: now={GameplayClock.NowSongTime:F3}, deadline={missDeadlineTime:F3}");
|
||||
JudgeMiss();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,8 +304,12 @@ public class Note : BaseNote
|
||||
JudgeSoundManager.Instance?.PlayJudgeSound(judgeResult);
|
||||
teamUIController.Instance?.OnJudgeResult(judgeResult);
|
||||
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note.AutoPlay] Spawning judge prefab: color={noteColor}, result={judgeResult}");
|
||||
Animation_GenerateJudgementSituationPrefab.Instance?.SpawnJudgePrefab(noteColor, judgeResult);
|
||||
string colorForPrefab = GetColorForPrefab();
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note.AutoPlay] Spawning judge prefab: color={colorForPrefab}, result={judgeResult}");
|
||||
if (!string.IsNullOrEmpty(colorForPrefab))
|
||||
{
|
||||
Animation_GenerateJudgementSituationPrefab.Instance?.SpawnJudgePrefab(colorForPrefab, judgeResult);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -303,6 +327,7 @@ public class Note : BaseNote
|
||||
|
||||
try { SkillBuilder.Instance?.NotifyNoteHit(TrackIndex, judgeResult, SkillDefinition.NoteTypeTrigger.Tap); } catch { }
|
||||
LogTapJudge(judgeResult, 0f, false, true, pressTime);
|
||||
GameplayLevelRuleEventBus.NotifyTapJudged(TrackIndex, judgeResult, pressTime, noteData);
|
||||
|
||||
if (isSyncNote)
|
||||
{
|
||||
@@ -453,10 +478,14 @@ public class Note : BaseNote
|
||||
InputManager.Instance?.ShowJudgeResult(TrackIndex, judgeResult);
|
||||
JudgeSoundManager.Instance?.PlayJudgeSound(judgeResult);
|
||||
teamUIController.Instance?.OnJudgeResult(judgeResult);
|
||||
|
||||
// Spawn judgment prefab - ensure noteColor is passed correctly
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note] Spawning judge prefab: color={noteColor}, result={judgeResult}");
|
||||
Animation_GenerateJudgementSituationPrefab.Instance?.SpawnJudgePrefab(noteColor, judgeResult);
|
||||
|
||||
// Spawn judgment prefab
|
||||
string colorForPrefab = GetColorForPrefab();
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note] Spawning judge prefab: color={colorForPrefab}, result={judgeResult}");
|
||||
if (!string.IsNullOrEmpty(colorForPrefab))
|
||||
{
|
||||
Animation_GenerateJudgementSituationPrefab.Instance?.SpawnJudgePrefab(colorForPrefab, judgeResult);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -474,6 +503,7 @@ public class Note : BaseNote
|
||||
|
||||
try { SkillBuilder.Instance?.NotifyNoteHit(TrackIndex, judgeResult, SkillDefinition.NoteTypeTrigger.Tap); } catch { }
|
||||
LogTapJudge(judgeResult, rawOffsetMs, rewrittenToPerfect, false, pressTime);
|
||||
GameplayLevelRuleEventBus.NotifyTapJudged(TrackIndex, judgeResult, pressTime, noteData);
|
||||
|
||||
if (isSyncNote && judgeResult != "Miss")
|
||||
{
|
||||
@@ -533,8 +563,14 @@ public class Note : BaseNote
|
||||
|
||||
public void JudgeMiss()
|
||||
{
|
||||
Debug.Log($"[Note.JudgeMiss] Called for {noteColor} on track {TrackIndex}, isJudged={isJudged}");
|
||||
|
||||
// idempotent: this can be called from multiple paths
|
||||
if (isJudged) return;
|
||||
if (isJudged)
|
||||
{
|
||||
Debug.Log($"[Note.JudgeMiss] Already judged, skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
isJudged = true;
|
||||
ScoreManager.Instance.countMiss += 1;
|
||||
@@ -549,10 +585,24 @@ public class Note : BaseNote
|
||||
InputManager.Instance?.ShowJudgeResult(TrackIndex, "Miss");
|
||||
JudgeSoundManager.Instance?.PlayJudgeSound("Miss");
|
||||
teamUIController.Instance?.OnJudgeResult("Miss");
|
||||
|
||||
// Spawn judgment prefab for Miss - ensure noteColor is passed correctly
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note.JudgeMiss] Spawning miss judge prefab: color={noteColor}");
|
||||
Animation_GenerateJudgementSituationPrefab.Instance?.SpawnJudgePrefab(noteColor, "Miss");
|
||||
|
||||
// 生成 Miss 判定 prefab(调试日志无条件输出,便于排查问题)
|
||||
string colorForPrefab = GetColorForPrefab();
|
||||
Debug.Log($"[Note.JudgeMiss] Attempting to spawn miss prefab: noteColor={noteColor}, TrackIndex={TrackIndex}, derivedColor={colorForPrefab}, Instance={(Animation_GenerateJudgementSituationPrefab.Instance != null ? "EXISTS" : "NULL")}");
|
||||
|
||||
if (string.IsNullOrEmpty(colorForPrefab))
|
||||
{
|
||||
Debug.LogError($"[Note.JudgeMiss] Cannot spawn miss prefab: colorForPrefab is null! noteColor={noteColor}, TrackIndex={TrackIndex}");
|
||||
}
|
||||
else if (Animation_GenerateJudgementSituationPrefab.Instance == null)
|
||||
{
|
||||
Debug.LogError($"[Note.JudgeMiss] Cannot spawn miss prefab: Animation_GenerateJudgementSituationPrefab.Instance is NULL!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Animation_GenerateJudgementSituationPrefab.Instance.SpawnJudgePrefab(colorForPrefab, "Miss");
|
||||
Debug.Log($"[Note.JudgeMiss] SpawnJudgePrefab called successfully for {colorForPrefab}");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
@@ -570,6 +620,7 @@ public class Note : BaseNote
|
||||
|
||||
try { SkillBuilder.Instance?.NotifyNoteHit(TrackIndex, "Miss", SkillDefinition.NoteTypeTrigger.Tap); } catch { }
|
||||
LogTapJudge("Miss", 0f, false, false, GameplayClock.NowSongTime);
|
||||
GameplayLevelRuleEventBus.NotifyTapJudged(TrackIndex, "Miss", GameplayClock.NowSongTime, noteData);
|
||||
|
||||
// notify global judge manager that this note has been finally judged (miss)
|
||||
JudgeManager.Instance?.NotifyNoteJudged();
|
||||
@@ -623,6 +674,8 @@ public class Note : BaseNote
|
||||
/// </summary>
|
||||
public void SetJudgeZone(bool inZone)
|
||||
{
|
||||
Debug.Log($"[Note.SetJudgeZone] {noteColor} on track {TrackIndex}: inZone={inZone}, isJudged={isJudged}");
|
||||
|
||||
// leaving judge zone
|
||||
if (!inZone)
|
||||
{
|
||||
@@ -630,11 +683,11 @@ public class Note : BaseNote
|
||||
if (!isJudged)
|
||||
{
|
||||
// IMPORTANT: Don't call JudgeMiss directly here because SetJudgeZone is called
|
||||
// from OnTriggerExit2D, which is in a physics callback.
|
||||
// from OnTriggerExit2D, which is in a physics callback.
|
||||
// Calling ReturnToPool (which deactivates the object) inside a physics callback
|
||||
// causes "GameObject is already being activated or deactivated" errors.
|
||||
// Instead, mark for miss and let Update handle it next frame.
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[Note.SetJudgeZone] Note {noteColor} left judge zone on track {TrackIndex}, will force Miss next frame");
|
||||
Debug.Log($"[Note.SetJudgeZone] Note {noteColor} left judge zone on track {TrackIndex}, setting deadline to now");
|
||||
missDeadlineTime = GameplayClock.NowSongTime; // Force deadline to now so Update will handle it
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user