Files
aibis-dream/Assets/Scripts/Game Loop/TextSpeedSettings.cs
T

98 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using UnityEngine;
namespace AibisDream
{
/// <summary>
/// 文字速度设置的运行时快照与规范化规则。
/// 各文字视图在开始新行时读取 CurrentMultiplier,确保设置不会改变正在播放的行。
/// </summary>
public static class TextSpeedSettings
{
public const float SlowMultiplier = 0.5f;
public const float DefaultMultiplier = 1f;
public const float FastMultiplier = 3f;
public const string SlowValue = "0.5";
public const string DefaultValue = "1.0";
public const string FastValue = "3.0";
private static readonly HashSet<string> WarnedInvalidValues = new(StringComparer.Ordinal);
public static float CurrentMultiplier { get; private set; } = DefaultMultiplier;
public static string CurrentCanonicalValue { get; private set; } = DefaultValue;
public static void Reset()
{
CurrentMultiplier = DefaultMultiplier;
CurrentCanonicalValue = DefaultValue;
WarnedInvalidValues.Clear();
}
public static bool ApplyStoredValue(string value)
{
var isValid = TryNormalize(value, out var multiplier, out var canonicalValue);
CurrentMultiplier = multiplier;
CurrentCanonicalValue = canonicalValue;
if (!isValid)
{
WarnInvalidValueOnce(value);
}
return isValid;
}
public static bool TryNormalize(string value, out float multiplier, out string canonicalValue)
{
multiplier = DefaultMultiplier;
canonicalValue = DefaultValue;
if (string.IsNullOrWhiteSpace(value) ||
!float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) ||
float.IsNaN(parsed) ||
float.IsInfinity(parsed))
{
return false;
}
if (Mathf.Approximately(parsed, SlowMultiplier))
{
multiplier = SlowMultiplier;
canonicalValue = SlowValue;
return true;
}
if (Mathf.Approximately(parsed, DefaultMultiplier))
{
multiplier = DefaultMultiplier;
canonicalValue = DefaultValue;
return true;
}
if (Mathf.Approximately(parsed, FastMultiplier))
{
multiplier = FastMultiplier;
canonicalValue = FastValue;
return true;
}
return false;
}
private static void WarnInvalidValueOnce(string value)
{
var warningKey = value ?? "<null>";
if (!WarnedInvalidValues.Add(warningKey))
{
return;
}
Debug.LogWarning(
$"[TextSpeedSettings] 不支持的文字速度 '{warningKey}',本次运行使用默认值 {DefaultValue}。");
}
}
}