using UnityEngine; /// /// 练习模式配置:支持从任意位置起播 + A-B 段落循环。 /// 供后续快速接入(UI/GameManager 逻辑需另行连接)。 /// 默认关闭,不影响现有正常游玩流程。 /// public static class PracticeMode { private const string PREF_ENABLED = "PracticeMode_Enabled"; private const string PREF_START_TIME = "PracticeMode_StartTime"; private const string PREF_END_TIME = "PracticeMode_EndTime"; private const string PREF_LOOP = "PracticeMode_Loop"; /// /// 练习模式开关(默认 false)。开启后从 StartTimeSeconds 起播,到达 EndTimeSeconds 时结束或循环。 /// public static bool Enabled { get => PlayerPrefs.GetInt(PREF_ENABLED, 0) == 1; set { PlayerPrefs.SetInt(PREF_ENABLED, value ? 1 : 0); PlayerPrefs.Save(); } } /// /// 起始时间(秒,谱面 songTime)。默认 0(从头开始)。 /// public static float StartTimeSeconds { get => PlayerPrefs.GetFloat(PREF_START_TIME, 0f); set { PlayerPrefs.SetFloat(PREF_START_TIME, Mathf.Max(0f, value)); PlayerPrefs.Save(); } } /// /// 结束时间(秒,谱面 songTime)。默认 -1(无限制,播到谱面结束)。 /// 若 >= 0 且 < StartTimeSeconds,视为无效,忽略。 /// public static float EndTimeSeconds { get => PlayerPrefs.GetFloat(PREF_END_TIME, -1f); set { PlayerPrefs.SetFloat(PREF_END_TIME, value); PlayerPrefs.Save(); } } /// /// A-B 循环开关(默认 false)。若开启且 EndTimeSeconds 有效,到达终点时自动重新加载并从 StartTimeSeconds 继续。 /// public static bool LoopEnabled { get => PlayerPrefs.GetInt(PREF_LOOP, 0) == 1; set { PlayerPrefs.SetInt(PREF_LOOP, value ? 1 : 0); PlayerPrefs.Save(); } } /// /// 检查当前 songTime 是否已到达练习终点(需要结束或循环)。 /// public static bool ShouldEndOrLoop(float currentSongTime) { if (!Enabled) return false; float end = EndTimeSeconds; if (end < 0f) return false; // 无限制 if (end <= StartTimeSeconds) return false; // 无效配置 return currentSongTime >= end; } /// /// 重置为默认值(关闭、从头播放、无循环)。 /// public static void Reset() { Enabled = false; StartTimeSeconds = 0f; EndTimeSeconds = -1f; LoopEnabled = false; } /// /// 快捷方法:设置 A-B 段落循环(自动开启练习模式和循环开关)。 /// public static void SetABLoop(float startSeconds, float endSeconds) { Enabled = true; StartTimeSeconds = startSeconds; EndTimeSeconds = endSeconds; LoopEnabled = true; } }