Решили: обводку и подложку боевой цифры включать ключевыми словами шейдера (OUTLINE_ON, UNDERLAY_ON), а не одними значениями свойств.

Почему: свойства _OutlineWidth / _OutlineColor / _UnderlayColor в материале цифры стояли с самого его создания, но шейдер TMP читает их только при включённом ключевом слове. Материал, сделанный копией дефолтного материала шрифта (new Material(fontAsset.material) или CopySerialized), приносит значения и НЕ приносит keywords — в файле .mat это видно как пустой m_ValidKeywords. Из-за этого цифра всё время рисовалась плоской: тёмный текст ложился на тёмное тело и на землю без всякого контура, а инспектор при этом показывал «обводка 0.256» и выглядел исправным.

Грабли: проверять надо не поле в инспекторе, а m_ValidKeywords в .mat (или material.IsKeywordEnabled). Симптом «значение стоит, эффекта нет» у TMP означает keyword, а не кривое число. Тот же механизм у мягкой тени: без UNDERLAY_ON смещение и мягкость игнорируются.

Владелец правды: Assets/_Project/Art/Materials/TMP_CombatNumber_Outline.mat, префаб Prefabs/UI/FloatingText.prefab.