Решили: тинт тела отдаётся как есть, White включительно (ResolveBodyTint() => _tint), и ставится ТОЛЬКО юнитам, которые делят спрайт с кем-то ещё; у владельца своего арта и у оригинала внутри группы тинт остаётся White. Полноту правила держит UnitTintPolicyTests.

Почему: в резолвере стоял дев-фолбэк «White = не задан → оттенок от хеша имени», и он красил восемь юнитов из семнадцати цветом, который никто не выбирал: огненный мечник получал hue 147 — зелёный, «стандартная» болванка 126 — тоже зелёный. Хеш имени не знает ни цвета арта, ни того, делит ли юнит спрайт, то есть отвечал на вопрос, которого не задавали. Отвергли починку «подобрать хорошие цвета всем» и оставить фолбэк: цвет тела — авторское решение, а фолбэк по определению отбирает его у автора и делает невидимым в инспекторе. Второй довод фактический: каталог визуалов уже читал сырое Tint, а бой и карточка — резолвер, так что «единый источник цвета» существовал только на словах.

Грабли: тинт УМНОЖАЕТСЯ на готовый цветной арт, поэтому перекрасить им персонажа физически нельзя, и половина странных цветов была именно попыткой это сделать. Друид красился зелёным поверх красного воина (Medieval Warrior 2) — на выходе бурая грязь; древень — зелёным поверх синего рыцаря (Medieval Warrior 3). Умножение умеет только затемнять и глушить, так что повторкам ставим приглушающий сдвиг, а настоящая перекраска — работа Palette Remapper или своего арта. Вторая: делящие арт группы не видны ни из SO, ни из префаба по отдельности — спрайт назначается в ПРЕФАБЕ (у трёх юнитов вообще наследуется от базового UnitView.prefab), цвет живёт в SO, и ни одна сторона шва не видит вторую. Отсюда правило в тесте, а не в комментарии.

Владелец правды: Assets/_Project/Scripts/Data/Definitions/UnitData.cs (ResolveBodyTint), тест Assets/_Project/Tests/EditMode/Content/UnitTintPolicyTests.cs.