Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/Track.cs
TRADER_FOER 02617c1385 着重优化调度
Signed-off-by: TRADER_FOER <lhf190@outlook.com>
2026-07-21 09:58:21 +08:00

143 lines
4.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame.Beatmap;
using Lean.Pool;
using Sirenix.OdinInspector;
using UniRx;
using UnityEngine;
using UnityEngine.Serialization;
namespace Ichni.RhythmGame
{
public partial class Track : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule, IScheduledElement, IHaveDirtyMarkSubmodule
{
#region [] Essential Configs
public GameObject trackRenderer;
#endregion
#region [] Submodules
public TransformSubmodule transformSubmodule { get; set; }
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public TrackPathSubmodule trackPathSubmodule { get; set; }
public TrackTimeSubmodule trackTimeSubmodule { get; set; }
public TrackRendererSubmodule trackRendererSubmodule { get; set; }
public DirtyMarkSubmodule dirtyMarkSubmodule { get; set; }
#endregion
#region [] Lifecycle & Factory
public static Track GenerateElement(string elementName, Guid id, List<string> tags, bool isFirstGenerated, GameElement parentElement)
{
Track track = LeanPool.Spawn(GameManager.Instance.basePrefabs.track, parentElement.transform).GetComponent<Track>();
track.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
if (parentElement is ElementFolder folder)
{
folder.trackList.Add(track);
}
return track;
}
public override void SetDefaultSubmodules()
{
transformSubmodule = new TransformSubmodule(this);
timeDurationSubmodule = new TimeDurationSubmodule(this);
trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom, TrackSamplingType.TimeDistributed, false, false);
dirtyMarkSubmodule = new DirtyMarkSubmodule(this);
trackTimeSubmodule = null;
trackRendererSubmodule = null;
}
public override void AfterInitialize()
{
base.AfterInitialize();
// 保留 TrackManager 注册以维持 ManualLateUpdate 的 refreshedThisFrame 清除逻辑
GameManager.Instance.trackManager.RegisterTrack(this);
// 注册调度器 Phase 4TrackCore驱动 ManualUpdate
CoreServices.UpdateScheduler.Register(UpdatePhase.TrackCore, this);
CoreServices.UpdateScheduler.RegisterTrackSpline(this);
if (trackPathSubmodule != null)
{
if (trackPathSubmodule.pathNodeList.Count > 3) trackPathSubmodule.ClosePath();
}
if (trackRendererSubmodule != null)
{
trackRendererSubmodule.meshGenerator.autoUpdate =
GameManager.Instance.trackManager.EnableTrackAutoUpdate;
}
}
#endregion
#region [] Main Update
public void ManualUpdate(float currentSongTime)
{
if (timeDurationSubmodule.CheckTimeInDuration(currentSongTime))
{
(trackTimeSubmodule as TrackTimeSubmoduleMovable)?.UpdateTrackPart(currentSongTime);
}
}
public void ManualLateUpdate()
{
if (trackPathSubmodule != null) trackPathSubmodule.refreshedThisFrame = false;
}
#region [IScheduledElement] Scheduler Interface
public override void ScheduledUpdate(UpdatePhase phase, float songTime)
{
ManualUpdate(songTime);
}
public override bool IsScheduledActive => isActiveAndEnabled;
#endregion
#endregion
#region [] Behavior Overrides
public override void Refresh()
{
base.Refresh();
trackPathSubmodule?.Refresh();
trackTimeSubmodule?.Refresh();
trackRendererSubmodule?.Refresh();
}
public override void OnDelete()
{
GameManager.Instance.trackManager.UnregisterTrack(this);
CoreServices.UpdateScheduler.Unregister(UpdatePhase.TrackCore, this);
CoreServices.UpdateScheduler.UnregisterTrackSpline(this);
if (parentElement is ElementFolder folder) folder.trackList.Remove(this);
}
public void OnDirtyRefresh(Dictionary<string, bool> flags)
{
Refresh();
}
#endregion
}
#region [] Enums
public partial class Track
{
public enum TrackSpaceType
{
CatmullRom = 0,
BSpline = 1,
Linear = 3
}
public enum TrackSamplingType
{
TimeDistributed = 0,
DistanceDistributed = 1
}
}
#endregion
}