using System; using System.Collections.Generic; using System.Globalization; using UnityEngine; namespace AibisDream { /// /// 文字速度设置的运行时快照与规范化规则。 /// 各文字视图在开始新行时读取 CurrentMultiplier,确保设置不会改变正在播放的行。 /// 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 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 ?? ""; if (!WarnedInvalidValues.Add(warningKey)) { return; } Debug.LogWarning( $"[TextSpeedSettings] 不支持的文字速度 '{warningKey}',本次运行使用默认值 {DefaultValue}。"); } } }