using System.Collections.Generic; using UnityEngine.Localization; namespace AibisDream.MiniGame.Language { public sealed class ExpressionRoundTextSnapshot { private ExpressionRoundTextSnapshot( LocaleIdentifier locale, ExpressionParticleLocaleSettings profile, string targetText, List targetUnits, List targetGapWeights, List defaultPoolUnits, List interferencePoolUnits) { Locale = locale; Profile = profile; TargetText = targetText; TargetUnits = targetUnits.AsReadOnly(); TargetGapWeights = targetGapWeights.AsReadOnly(); DefaultPoolUnits = defaultPoolUnits.AsReadOnly(); InterferencePoolUnits = interferencePoolUnits.AsReadOnly(); } public LocaleIdentifier Locale { get; } public ExpressionParticleLocaleSettings Profile { get; } public string TargetText { get; } public IReadOnlyList TargetUnits { get; } public IReadOnlyList TargetGapWeights { get; } public IReadOnlyList DefaultPoolUnits { get; } public IReadOnlyList InterferencePoolUnits { get; } public static bool TryCreate( LocaleIdentifier locale, ExpressionParticleLocaleSettings profile, string targetText, IEnumerable interferencePhrases, string defaultPool, out ExpressionRoundTextSnapshot snapshot, out string error) { snapshot = null; profile ??= ExpressionParticleLocaleSettings.CreateFallback(); ExpressionTextTokenizer.UnitSequence target = ExpressionTextTokenizer.BuildLayoutUnits(targetText, profile.UnitMode); if (target.Count == 0) { error = "目标句没有有效的粒子单位。"; return false; } if (!ExpressionTextTokenizer.TryTokenizePool( defaultPool, profile.UnitMode, out List defaultUnits)) { error = "默认粒子池为空或包含非法分隔符。"; return false; } List interferenceUnits = ExpressionTextTokenizer.BuildUnitPool( interferencePhrases, profile.UnitMode); if (interferenceUnits.Count == 0) { error = "干扰短句没有有效的粒子单位。"; return false; } snapshot = new ExpressionRoundTextSnapshot( locale, profile, targetText, new List(target.Units), new List(target.GapWeights), defaultUnits, interferenceUnits); error = null; return true; } } }