Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/TrackSubmodules/TrackTimeSubmodule.cs

168 lines
5.5 KiB
C#
Raw Normal View History

2025-06-03 02:42:28 -04:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class TrackTimeSubmodule : TrackSubmodule
{
2026-03-14 03:13:10 -04:00
#region [] Config
2025-06-03 02:42:28 -04:00
public float headPercent, tailPercent;
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Initialization
2025-06-03 02:42:28 -04:00
public TrackTimeSubmodule(Track track) : base(track)
{
if (!HaveSameSubmodule)
{
this.track.trackTimeSubmodule = this;
}
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
}
2026-03-14 03:13:10 -04:00
#region [] Movable Submodule
2025-06-03 02:42:28 -04:00
public class TrackTimeSubmoduleMovable : TrackTimeSubmodule
{
2026-03-14 03:13:10 -04:00
#region [] Movable Configs
2025-06-03 02:42:28 -04:00
public float trackStartTime;
public float trackEndTime;
public float trackTotalTime;
public float visibleTrackTimeLength;
public AnimationCurveType animationCurveType;
private const float ClipChangeEpsilon = 0.0001f;
private bool hasClipState;
private float lastClipFrom;
private float lastClipTo;
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Initialization
2025-06-03 02:42:28 -04:00
public TrackTimeSubmoduleMovable(Track track, float trackStartTime, float trackEndTime,
float visibleTrackTimeLength, AnimationCurveType animationCurveType) : base(track)
{
this.trackStartTime = trackStartTime;
this.trackEndTime = trackEndTime;
this.trackTotalTime = trackEndTime - trackStartTime;
this.visibleTrackTimeLength = visibleTrackTimeLength;
this.animationCurveType = animationCurveType;
//timeDurationSubmodule 根据下辖Note的时间来设置
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Timing Calculation
public void UpdateTrackPart(float songTime)
2025-06-03 02:42:28 -04:00
{
CalculateVisibleClip(songTime, out float newTailPercent, out float newHeadPercent);
headPercent = newHeadPercent;
tailPercent = newTailPercent;
TrackRendererSubmodule rendererSubmodule = track.trackRendererSubmodule;
if (rendererSubmodule == null || rendererSubmodule.meshGenerator == null)
{
return;
}
bool clipChanged = !hasClipState ||
Mathf.Abs(lastClipFrom - tailPercent) > ClipChangeEpsilon ||
Mathf.Abs(lastClipTo - headPercent) > ClipChangeEpsilon;
bool rebuildRequested = rendererSubmodule.ConsumeMeshRebuildRequest();
2025-06-03 02:42:28 -04:00
if (!clipChanged && !rebuildRequested)
2025-06-03 02:42:28 -04:00
{
return;
2025-06-03 02:42:28 -04:00
}
rendererSubmodule.meshGenerator.clipFrom = tailPercent;
rendererSubmodule.meshGenerator.clipTo = headPercent;
rendererSubmodule.meshGenerator.RebuildImmediate();
hasClipState = true;
lastClipFrom = tailPercent;
lastClipTo = headPercent;
2026-06-05 04:45:57 -04:00
//track.trackPathSubmodule.path.Rebuild(true);
2025-06-03 02:42:28 -04:00
}
private void CalculateVisibleClip(float songTime, out float tailPercent, out float headPercent)
{
if (songTime <= trackStartTime)
{
tailPercent = 0f;
headPercent = 0f;
return;
}
if (songTime >= trackEndTime + visibleTrackTimeLength)
{
tailPercent = 1f;
headPercent = 1f;
return;
}
headPercent = GetTrackPercent(songTime);
tailPercent = GetTrackPercent(songTime - visibleTrackTimeLength);
}
2025-06-03 02:42:28 -04:00
public float GetTrackPercent(float songTimeInTime)
{
float per = AnimationCurveEvaluator.Evaluate(animationCurveType, (songTimeInTime - trackStartTime) / trackTotalTime);
return Mathf.Clamp01(per);
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Behavior Overrides
2025-06-03 02:42:28 -04:00
public override void Refresh()
{
trackTotalTime = trackEndTime - trackStartTime;
2026-03-14 03:13:10 -04:00
UpdateTrackPart(CoreServices.TimeProvider.SongTime);
2025-06-03 02:42:28 -04:00
track.childElementList.ForEach(child =>
{
if (child is NoteBase note)
{
2026-03-14 03:13:10 -04:00
note.UpdateNoteInTrack(CoreServices.TimeProvider.SongTime);
2025-06-03 02:42:28 -04:00
}
});
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
}
#endregion
2026-03-14 03:13:10 -04:00
#region [] Static Submodule
2025-06-03 02:42:28 -04:00
public class TrackTimeSubmoduleStatic : TrackTimeSubmodule
{
2026-03-14 03:13:10 -04:00
#region [] Static Configs
2025-06-03 02:42:28 -04:00
public float trackTotalTime;
public AnimationCurveType animationCurveType;
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Initialization
2025-06-03 02:42:28 -04:00
public TrackTimeSubmoduleStatic(Track track, float trackTotalTime, AnimationCurveType animationCurveType) :
base(track)
{
this.trackTotalTime = trackTotalTime;
this.animationCurveType = animationCurveType;
this.headPercent = 0;
this.tailPercent = 1;
//timeDurationSubmodule 根据下辖Note的时间来设置
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Behavior Overrides
2025-06-03 02:42:28 -04:00
public override void Refresh()
{
track.childElementList.ForEach(child =>
{
if (child is NoteBase note)
{
2026-03-14 03:13:10 -04:00
note.UpdateNoteInTrack(CoreServices.TimeProvider.SongTime);
2025-06-03 02:42:28 -04:00
}
});
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
}
#endregion
}