Решили: боевая цифра переезжает с дефолтного LiberationSans SDF на собственный TMP-ассет FiraSans-Bold TMP SDF (Static-атлас 2048, 213 глифов — тот же набор, что канон типографики требует от остальных шрифтов), а кривая «вес удара → размер цифры» переезжает из презентера в CombatFeelConfig.EvaluateNumberScale и становится КОРНЕВОЙ вместо прямой.

Почему:

  • Шрифт. Цифра — единственный TMP-текст в проекте, поэтому расхождение с дизайн-системой никто не ловил: Assets/_Project/UI/Fonts/*SDF*.asset — это TextCore-ассеты для UI Toolkit, TMP их не принимает, и в бою рисовался шрифт «из коробки Unity». Альтернатива «оставить как есть» стоила бы дешевле на один ассет в репо (8 МБ), но единственный текст, который игрок видит в бою, остался бы дефолтом.
  • Кривая. На прямой почти все удары боя лежат в нижней трети шкалы и выглядят одинаково мелкими — весь запас размера достаётся редкому киту. Корень отдаёт половину прироста уже на четверти порога, так что разница «поцарапал / врезал» читается там, где реально происходит.

Сказано: «А» (2026-07-31, выбор варианта с генерацией TMP-ассета).

Грабли:

  • TMP_FontAsset.CreateFontAsset(..., 1024, 1024, ...) молча вмещает не весь набор: 178 глифов из 213, а TryAddCharacters возвращает false и список недостающих — хвост кириллицы и вся экстра-пунктуация. Канонный атлас проекта — 2048, на нём набор влезает целиком.
  • Ассет создаётся Dynamic и переводится в Static ПОСЛЕ TryAddCharacters — иначе добавлять нечего; атлас-текстуру и материал шрифта надо явно положить в ассет через AddObjectToAsset.
  • Материал обводки пересобран поверх существующего через EditorUtility.CopySerialized, чтобы сохранить guid (на него уже ссылается префаб цифры). CopySerialized приносит с собой и m_Name источника — имя объекта пришлось возвращать руками, иначе оно врало бы относительно файла.
  • Материал звался TMP_NameLabel_Outline — по подписи, снятой решением /67; переименован в TMP_CombatNumber_Outline (RenameAsset сохраняет guid, ссылка не рвётся).

Владелец правды: CombatFeelConfig.EvaluateNumberScale, тест CombatNumberScaleTests (держит форму кривой, не числа), префаб Prefabs/UI/FloatingText.prefab.