using System.Collections.Generic; using UnityEngine; namespace Ichni.RhythmGame { public class TrackManager : MonoBehaviour { #region [核心管家字段] Fields // 这里可以分类存储场上的各类轨道组件 private List _activeTracks = new List(50); private List _activeHeadPoints = new List(50); private List _activePercentPoints = new List(50); private List _activeCrossPoints = new List(50); #endregion #region [注册与注销] Registration public void RegisterTrack(Track track) => _activeTracks.Add(track); public void UnregisterTrack(Track track) => _activeTracks.Remove(track); public void RegisterHeadPoint(TrackHeadPoint point) => _activeHeadPoints.Add(point); public void UnregisterHeadPoint(TrackHeadPoint point) => _activeHeadPoints.Remove(point); public void RegisterPercentPoint(TrackPercentPoint point) => _activePercentPoints.Add(point); public void UnregisterPercentPoint(TrackPercentPoint point) => _activePercentPoints.Remove(point); public void RegisterCrossPoint(CrossTrackPoint point) => _activeCrossPoints.Add(point); public void UnregisterCrossPoint(CrossTrackPoint point) => _activeCrossPoints.Remove(point); #endregion #region [中央集权主循环] Manager-Driven Tick // 注意:如果你希望将所有的 Manager 都由 GameManager.Update 统一调度, // 可以将此处的 Update() 和 LateUpdate() 改为公开的 ManualUpdate(float songTime)。 public void ManualUpdate(float currentSongTime) { if (!GameManager.Instance.songPlayer.isUpdating) return; // 1. 更新所有主轨道的滑动区间 for (var index = 0; index < _activeTracks.Count; index++) { var track = _activeTracks[index]; if (track.isActiveAndEnabled) track.ManualUpdate(currentSongTime); } // 2. 更新所有的轨道头部引导点 for (var index = 0; index < _activeHeadPoints.Count; index++) { var headPoint = _activeHeadPoints[index]; if (headPoint.isActiveAndEnabled) headPoint.ManualUpdate(currentSongTime); } // 3. 更新基于百分比的相对点 for (var index = 0; index < _activePercentPoints.Count; index++) { var percentPoint = _activePercentPoints[index]; if (percentPoint.isActiveAndEnabled) percentPoint.ManualUpdate(currentSongTime); } // 4. 更新跨轨切分点 for (var index = 0; index < _activeCrossPoints.Count; index++) { var crossPoint = _activeCrossPoints[index]; if (crossPoint.isActiveAndEnabled) crossPoint.ManualUpdate(currentSongTime); } } public void ManualLateUpdate(float currentSongTime) { if (!GameManager.Instance.songPlayer.isUpdating) return; // 执行所有轨道的重置与缓冲清理操作 foreach (var track in _activeTracks) { if(track.isActiveAndEnabled) track.ManualLateUpdate(); } } #endregion } }