Files
UnityPackages/Assets/Common/Timer/Runtime/UI/TimerDebugText.cs
2025-12-01 12:36:01 +08:00

68 lines
2.0 KiB
C#

using System;
using JoeSiu.Common.Serialization.Runtime;
using TMPro;
using UnityEditor;
using UnityEngine;
namespace Common.Timer.Runtime.UI
{
public class TimerDebugText : MonoBehaviour
{
[SerializeField]
private SerializableInterface<ITimer> _timer = new();
public TMP_Text text;
public string prefix;
public int decimalPlaces = 2;
public ITimer Timer
{
get => _timer.Value;
set => _timer.Value = value;
}
private void Reset()
{
text = GetComponent<TMP_Text>();
}
private void OnValidate()
{
#if UNITY_EDITOR
if (!EditorApplication.isPlaying && Selection.Contains(gameObject)) UpdateText(Timer);
#endif
}
private void Update()
{
UpdateText(Timer);
}
public void UpdateText(ITimer timer)
{
if (!text) return;
if (timer == null) return;
var format = $"F{decimalPlaces}";
var info = string.IsNullOrEmpty(prefix) ? "" : $"{prefix}\n";
if (timer is Behaviour behaviour) info += $"enabled: {behaviour.enabled}\n";
info += $"active: {timer.IsActive}\n";
switch (timer)
{
// Check if timer implements IStopwatch
case IStopwatch stopwatch:
info += $"isTimeReached: {stopwatch.IsTimeReached}\n";
info += $"{Math.Round(stopwatch.CurrentTime, decimalPlaces).ToString(format)}s / " +
$"{Math.Round(stopwatch.Duration, decimalPlaces).ToString(format)}s " +
$"(remain: {Math.Round(stopwatch.RemainingTime, decimalPlaces).ToString(format)}s)\n";
break;
// Fallback for base Timer class
default:
info += $"{Math.Round(timer.CurrentTime, decimalPlaces).ToString(format)}s\n";
break;
}
text.text = info;
}
}
}