79 lines
3.4 KiB
C#
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
|
|
}
|
|
}
|