using System; using System.Collections.Generic; using TMPro; using UnityEngine; namespace AibisDream.Framework { [Serializable] public sealed class TypographyStyle { [SerializeField] private TypographyRole role; [SerializeField] private TMP_FontAsset font; [SerializeField] private Material materialPreset; [SerializeField] private List fallbackFonts = new(); [SerializeField, Min(0.01f)] private float fontSizeMultiplier = 1f; [SerializeField] private float lineSpacingOffset; [SerializeField] private float characterSpacingOffset; public TypographyStyle( TypographyRole role, TMP_FontAsset font, Material materialPreset = null, IEnumerable fallbackFonts = null, float fontSizeMultiplier = 1f, float lineSpacingOffset = 0f, float characterSpacingOffset = 0f) { this.role = role; this.font = font; this.materialPreset = materialPreset; this.fallbackFonts = fallbackFonts != null ? new List(fallbackFonts) : new List(); this.fontSizeMultiplier = Mathf.Max(0.01f, fontSizeMultiplier); this.lineSpacingOffset = lineSpacingOffset; this.characterSpacingOffset = characterSpacingOffset; } public TypographyRole Role => role; public TMP_FontAsset Font => font; public Material MaterialPreset => materialPreset; public IReadOnlyList FallbackFonts => fallbackFonts; public float FontSizeMultiplier => Mathf.Max(0.01f, fontSizeMultiplier); public float LineSpacingOffset => lineSpacingOffset; public float CharacterSpacingOffset => characterSpacingOffset; public bool IsUsable => font != null; internal void ApplyFallbacks() { if (font == null) return; font.fallbackFontAssetTable ??= new List(); font.fallbackFontAssetTable.Clear(); if (fallbackFonts == null) return; foreach (TMP_FontAsset fallback in fallbackFonts) { if (fallback != null && fallback != font && !font.fallbackFontAssetTable.Contains(fallback)) font.fallbackFontAssetTable.Add(fallback); } } } }