98 lines
3.1 KiB
C#
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}。");
|
|
}
|
|
}
|
|
}
|