Files
aibis-dream/Assets/Scripts/Typography/TypographyStyle.cs
T

66 lines
2.4 KiB
C#

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<TMP_FontAsset> 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<TMP_FontAsset> 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<TMP_FontAsset>(fallbackFonts)
: new List<TMP_FontAsset>();
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<TMP_FontAsset> 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<TMP_FontAsset>();
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);
}
}
}
}