@@ -24,6 +24,7 @@ namespace Ichni.RhythmGame
|
||||
public bool zWrite;
|
||||
public Vector2 uvScale;
|
||||
public Vector2 uvOffset;
|
||||
private bool requiresMeshRebuild;
|
||||
#endregion
|
||||
|
||||
#region [初始化与防御机制] Initialization & Defense
|
||||
@@ -72,17 +73,44 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
if (meshGenerator == null) return;
|
||||
|
||||
bool colorChanged = false;
|
||||
if (meshGenerator.color != color)
|
||||
{
|
||||
meshGenerator.color = color;
|
||||
colorChanged = true;
|
||||
}
|
||||
|
||||
if (forceImmediateRebuild && track.trackTimeSubmodule is not TrackTimeSubmoduleMovable)
|
||||
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable)
|
||||
{
|
||||
if (colorChanged || forceImmediateRebuild)
|
||||
{
|
||||
RequestMeshRebuild();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (forceImmediateRebuild)
|
||||
{
|
||||
meshGenerator.RebuildImmediate();
|
||||
}
|
||||
}
|
||||
|
||||
public void RequestMeshRebuild()
|
||||
{
|
||||
requiresMeshRebuild = true;
|
||||
}
|
||||
|
||||
public bool ConsumeMeshRebuildRequest()
|
||||
{
|
||||
if (!requiresMeshRebuild)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
requiresMeshRebuild = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
protected void SetMesh()
|
||||
{
|
||||
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
|
||||
|
||||
@@ -31,6 +31,11 @@ namespace Ichni.RhythmGame
|
||||
public float trackTotalTime;
|
||||
public float visibleTrackTimeLength;
|
||||
public AnimationCurveType animationCurveType;
|
||||
private const float ClipChangeEpsilon = 0.0001f;
|
||||
private bool hasClipState;
|
||||
private float lastClipFrom;
|
||||
private float lastClipTo;
|
||||
|
||||
#endregion
|
||||
|
||||
#region [生命周期] Initialization
|
||||
@@ -49,17 +54,54 @@ namespace Ichni.RhythmGame
|
||||
#region [时间运算逻辑] Timing Calculation
|
||||
public void UpdateTrackPart(float songTime)
|
||||
{
|
||||
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();
|
||||
|
||||
if (!clipChanged && !rebuildRequested)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
rendererSubmodule.meshGenerator.clipFrom = tailPercent;
|
||||
rendererSubmodule.meshGenerator.clipTo = headPercent;
|
||||
rendererSubmodule.meshGenerator.RebuildImmediate();
|
||||
|
||||
hasClipState = true;
|
||||
lastClipFrom = tailPercent;
|
||||
lastClipTo = headPercent;
|
||||
//track.trackPathSubmodule.path.Rebuild(true);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (track.trackRendererSubmodule != null)
|
||||
{
|
||||
track.trackRendererSubmodule.meshGenerator.clipFrom = tailPercent;
|
||||
track.trackRendererSubmodule.meshGenerator.clipTo = headPercent;
|
||||
track.trackRendererSubmodule.meshGenerator.RebuildImmediate();
|
||||
}
|
||||
|
||||
//track.trackPathSubmodule.path.Rebuild(true);
|
||||
}
|
||||
|
||||
public float GetTrackPercent(float songTimeInTime)
|
||||
|
||||
Reference in New Issue
Block a user