ui基本完毕,修了一大把的bug
This commit is contained in:
@@ -43,6 +43,20 @@ public class HoldNote : BaseNote
|
||||
// whether this middle segment was held from the start (used for logic checks)
|
||||
private bool hasBeenHeldFromStart = false;
|
||||
|
||||
// Previous-frame held state for this track, used to derive key-down / key-up edges
|
||||
// from the platform-agnostic InputManager.IsTrackHeld table instead of polling
|
||||
// Input.GetKeyDown/Up directly (which touch cannot drive on Android).
|
||||
private bool prevTrackHeld = false;
|
||||
|
||||
// Query the shared held-state table (keyboard OR touch). Falls back to legacy
|
||||
// Input.GetKey if the InputManager is somehow absent so editor/standalone still works.
|
||||
private bool IsHeld()
|
||||
{
|
||||
var im = InputManager.Instance;
|
||||
if (im != null) return im.IsTrackHeld(trackIndex);
|
||||
return Input.GetKey(keyToPress);
|
||||
}
|
||||
|
||||
[Header("Judge configuration")]
|
||||
public NoteJudgeConfig judgeConfig; // judge windows configuration
|
||||
private NoteData noteData;
|
||||
@@ -56,9 +70,9 @@ public class HoldNote : BaseNote
|
||||
private List<UnityEngine.UI.Graphic> cachedUIComponents = new List<UnityEngine.UI.Graphic>();
|
||||
|
||||
[Header("Hold judgement adjustments")]
|
||||
[Tooltip("Multiplier applied to judgement windows for hold notes. >1 makes hold judgement more lenient (wider windows).")]
|
||||
[Range(1f, 2f)]
|
||||
public float holdWindowMultiplier = 1.3f;
|
||||
[Tooltip("Multiplier applied to judgement windows for hold notes. Lower values make hold judgement stricter.")]
|
||||
[Range(0.1f, 2f)]
|
||||
public float holdWindowMultiplier = 0.8f;
|
||||
|
||||
public float visualSpeedMultiplier = 1f; // injected from NoteSpawner to adapt windows when visual speed changes
|
||||
|
||||
@@ -434,6 +448,16 @@ public class HoldNote : BaseNote
|
||||
bool debugEnabled = JudgeManager.IsDebugEnabled;
|
||||
float now = Time.time;
|
||||
|
||||
// Sample held state and derive key-down/up edges at the very top, BEFORE any
|
||||
// early return. Unity's Input.GetKeyDown/Up are global per-frame edges that
|
||||
// don't depend on whether we polled last frame; updating prevTrackHeld every
|
||||
// frame reproduces that. If we only sampled after the early exits below, a key
|
||||
// already held when the note enters range would produce a false keyDown.
|
||||
bool keyHeld = IsHeld();
|
||||
bool keyDown = keyHeld && !prevTrackHeld;
|
||||
bool keyUp = !keyHeld && prevTrackHeld;
|
||||
prevTrackHeld = keyHeld;
|
||||
|
||||
// Optimization: Early exit if the note is far from judgment line and hasn't entered yet
|
||||
if (!hasEnteredLine)
|
||||
{
|
||||
@@ -448,10 +472,6 @@ public class HoldNote : BaseNote
|
||||
return;
|
||||
}
|
||||
|
||||
bool keyHeld = Input.GetKey(keyToPress);
|
||||
bool keyDown = Input.GetKeyDown(keyToPress);
|
||||
bool keyUp = Input.GetKeyUp(keyToPress);
|
||||
|
||||
// If start was judged and player is holding key, start hold effects
|
||||
if (!isHoldActive && jm != null && jm.IsStartJudged(noteID) && !jm.HasNoteReleased(noteID) && keyHeld)
|
||||
{
|
||||
@@ -694,8 +714,8 @@ public class HoldNote : BaseNote
|
||||
}
|
||||
else if (segment == NoteSegment.Middle)
|
||||
{
|
||||
hasBeenHeldFromStart = Input.GetKey(keyToPress);
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[HoldNote] Middle enter: color={noteColor}, isStartJudged={JudgeManager.Instance.IsStartJudged(noteID)}, hasReleased={JudgeManager.Instance.HasNoteReleased(noteID)}, isKeyHeld={Input.GetKey(keyToPress)}, hasBeenHeldFromStart={hasBeenHeldFromStart}");
|
||||
hasBeenHeldFromStart = IsHeld();
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[HoldNote] Middle enter: color={noteColor}, isStartJudged={JudgeManager.Instance.IsStartJudged(noteID)}, hasReleased={JudgeManager.Instance.HasNoteReleased(noteID)}, isKeyHeld={IsHeld()}, hasBeenHeldFromStart={hasBeenHeldFromStart}");
|
||||
|
||||
if (autoReturnCoroutine != null)
|
||||
StopCoroutine(autoReturnCoroutine);
|
||||
@@ -716,7 +736,7 @@ public class HoldNote : BaseNote
|
||||
|
||||
// If the key is still being held down when end segment enters judge zone, immediately judge.
|
||||
// Autoplay must ignore physical input to guarantee Perfect at scheduledEndTime.
|
||||
if (!GameConfig.autoPlayEnabled && Input.GetKey(keyToPress) && JudgeManager.Instance.IsStartJudged(noteID) && !isJudged)
|
||||
if (!GameConfig.autoPlayEnabled && IsHeld() && JudgeManager.Instance.IsStartJudged(noteID) && !isJudged)
|
||||
{
|
||||
if (JudgeManager.IsDebugEnabled) Debug.Log($"[HoldNote] End entered while key still held: {noteColor}, forcing Perfect");
|
||||
// Record release time as current time (player is still holding)
|
||||
@@ -980,6 +1000,11 @@ public class HoldNote : BaseNote
|
||||
JudgeSoundManager.Instance?.PlayJudgeSound(result);
|
||||
}
|
||||
|
||||
if (result != "Miss")
|
||||
{
|
||||
TrackJudgeHitEffectController.PlayTrackHitFx(trackIndex);
|
||||
}
|
||||
|
||||
// Do not spawn the judgement animation prefab for Start (head) presses to avoid duplicated prefabs
|
||||
if (segment != NoteSegment.Start)
|
||||
{
|
||||
@@ -1152,6 +1177,11 @@ public class HoldNote : BaseNote
|
||||
teamUIController.Instance?.OnJudgeResult(result);
|
||||
}
|
||||
|
||||
if (result != "Miss")
|
||||
{
|
||||
TrackJudgeHitEffectController.PlayTrackHitFx(trackIndex);
|
||||
}
|
||||
|
||||
// Ensure END always spawns judgement prefab (including Miss)
|
||||
Animation_GenerateJudgementSituationPrefab.Instance?.SpawnJudgePrefab(noteColor, result);
|
||||
|
||||
@@ -1295,7 +1325,7 @@ public class HoldNote : BaseNote
|
||||
// record release time and register release in JudgeManager
|
||||
if (!hasReleased)
|
||||
{
|
||||
if (Input.GetKey(keyToPress))
|
||||
if (IsHeld())
|
||||
{
|
||||
releaseTime = scheduledEndTime;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user