Решили: боевая цифра переезжает с дефолтного 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.