Files

97 lines
3.0 KiB
C#

using UnityEngine;
using TMPro;
public class runningTime : MonoBehaviour
{
public TextMeshProUGUI allRunningTime;
public AudioSource bgMusicAudioSource; // optional: can be assigned in inspector
// progressLine/zhuangshi (1): Scale.x is driven by playedTime/totalLength (0..1)
private Transform progressLineDecor;
private Vector3 progressLineDecorBaseScale;
private bool progressLineDecorBaseScaleCached;
private GameManager gm;
void Start()
{
gm = SceneObjectLookupCache.FindAny<GameManager>();
if (bgMusicAudioSource == null && gm != null)
{
bgMusicAudioSource = gm.musicSource;
}
// Cache progress bar transform (optional)
try
{
var go = SceneObjectLookupCache.Find("progressLine/zhuangshi (1)");
if (go != null) progressLineDecor = go.transform;
if (progressLineDecor != null)
{
progressLineDecorBaseScale = progressLineDecor.localScale;
progressLineDecorBaseScaleCached = true;
}
}
catch { }
// ensure UI shows zero initially
if (allRunningTime != null) allRunningTime.text = "00:00";
UpdateProgressBar(0f);
}
void Update()
{
// Display played time after the game manager indicates playback actually started.
// Do not require isPlaying so pause will keep the last value instead of resetting.
if (gm != null && gm.PlaybackStarted && bgMusicAudioSource != null && bgMusicAudioSource.clip != null)
{
float played = Mathf.Max(0f, bgMusicAudioSource.time);
float total = Mathf.Max(0.0001f, bgMusicAudioSource.clip.length);
if (allRunningTime != null)
allRunningTime.text = FormatMMSS(played);
UpdateProgressBar(played / total);
return;
}
{
if (allRunningTime != null) allRunningTime.text = "00:00";
UpdateProgressBar(0f);
}
}
private void UpdateProgressBar(float ratio01)
{
if (progressLineDecor == null)
{
try
{
var go = SceneObjectLookupCache.Find("progressLine/zhuangshi (1)");
if (go != null) progressLineDecor = go.transform;
}
catch { }
}
if (progressLineDecor == null) return;
if (!progressLineDecorBaseScaleCached)
{
progressLineDecorBaseScale = progressLineDecor.localScale;
progressLineDecorBaseScaleCached = true;
}
float r = Mathf.Clamp01(ratio01);
var s = progressLineDecorBaseScale;
s.x = r;
progressLineDecor.localScale = s;
}
private static string FormatMMSS(float seconds)
{
if (seconds < 0f) seconds = 0f;
int total = Mathf.FloorToInt(seconds);
int mins = total / 60;
int secs = total % 60;
return mins.ToString("00") + ":" + secs.ToString("00");
}
}