This commit is contained in:
SoulliesOfficial
2026-03-14 02:30:26 -04:00
parent cf86f0ee51
commit aee62cd637
2041 changed files with 246771 additions and 129128 deletions

View File

@@ -0,0 +1,96 @@
using System.Collections.Generic;
using Ichni.RhythmGame;
using SLSUtilities.General;
using UnityEngine;
namespace Ichni
{
/// <summary>
/// 编辑器 TrackManager集中管理场上所有轨道相关组件的逐帧更新。
/// 替代各组件自身持有的 Update() 调用,消除大量零散的 MonoBehaviour 帧回调开销。
/// 通过 ManualTick() 由 EditorManager 统一调度,确保时序可控。
/// </summary>
public class TrackManager : Singleton<TrackManager>
{
#region [] Singleton Alias
public new static TrackManager instance => Instance;
#endregion
#region [] Active Component Lists
private readonly List<Track> _activeTracks = new List<Track>(50);
private readonly List<CrossTrackPoint> _activeCrossPoints = new List<CrossTrackPoint>(50);
private readonly List<ObjectTracker> _activeObjectTrackers = new List<ObjectTracker>(50);
private readonly List<ParticleTracker> _activeParticleTrackers = new List<ParticleTracker>(50);
// 注意TrackHeadPoint / TrackPercentPoint 在编辑器中无对应的逐帧更新逻辑,暂不加入
#endregion
#region [] Registration
public void RegisterTrack(Track track)
{
if (!_activeTracks.Contains(track)) _activeTracks.Add(track);
}
public void UnregisterTrack(Track track) => _activeTracks.Remove(track);
public void RegisterCrossPoint(CrossTrackPoint point)
{
if (!_activeCrossPoints.Contains(point)) _activeCrossPoints.Add(point);
}
public void UnregisterCrossPoint(CrossTrackPoint point) => _activeCrossPoints.Remove(point);
public void RegisterObjectTracker(ObjectTracker tracker)
{
if (!_activeObjectTrackers.Contains(tracker)) _activeObjectTrackers.Add(tracker);
}
public void UnregisterObjectTracker(ObjectTracker tracker) => _activeObjectTrackers.Remove(tracker);
public void RegisterParticleTracker(ParticleTracker tracker)
{
if (!_activeParticleTrackers.Contains(tracker)) _activeParticleTrackers.Add(tracker);
}
public void UnregisterParticleTracker(ParticleTracker tracker) => _activeParticleTrackers.Remove(tracker);
#endregion
#region [] Manager-Driven Tick
/// <summary>
/// 由 EditorManager.Update 统一调度。
/// </summary>
public void ManualTick(float songTime)
{
// 1. Track更新轨道时间子模块
for (int i = 0; i < _activeTracks.Count; i++)
{
var track = _activeTracks[i];
if (!track.isActiveAndEnabled) continue;
if (track.timeDurationSubmodule.CheckTimeInDuration(songTime))
{
(track.trackTimeSubmodule as TrackTimeSubmoduleMovable)?.UpdateTrackPart(songTime);
}
}
// 2. CrossTrackPoint更新跨轨切分点
for (int i = 0; i < _activeCrossPoints.Count; i++)
{
var point = _activeCrossPoints[i];
if (!point.isActiveAndEnabled) continue;
point.ManualTick(songTime);
}
// 3. ObjectTracker更新轨道物体跟踪器
for (int i = 0; i < _activeObjectTrackers.Count; i++)
{
var tracker = _activeObjectTrackers[i];
if (!tracker.isActiveAndEnabled) continue;
tracker.ManualTick(songTime);
}
// 4. ParticleTracker更新轨道粒子跟踪器
for (int i = 0; i < _activeParticleTrackers.Count; i++)
{
var tracker = _activeParticleTrackers[i];
if (!tracker.isActiveAndEnabled) continue;
tracker.ManualTick(songTime);
}
}
#endregion
}
}