Files
ichni_Official/Assets/Scripts/Manager/TrackManager.cs
SoulliesOfficial 7580c4d87c 大更
2026-03-14 03:13:10 -04:00

79 lines
3.4 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class TrackManager : MonoBehaviour
{
#region [] Fields
// 这里可以分类存储场上的各类轨道组件
private List<Track> _activeTracks = new List<Track>(50);
private List<TrackHeadPoint> _activeHeadPoints = new List<TrackHeadPoint>(50);
private List<TrackPercentPoint> _activePercentPoints = new List<TrackPercentPoint>(50);
private List<CrossTrackPoint> _activeCrossPoints = new List<CrossTrackPoint>(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
}
}