Решили: сортировка спрайтов на арене держится на двух уровнях, и оба обязательны.
- Верхний — код. Слой и
sortingOrderраздаёт презентация; у скелетного тела их получаетSortingGroupцеликом, внутри группы действует наш порядок частей (SkeletalBodyVisual). Этот уровень разводит РАЗНЫЕ сущности: тело против VFX, оверлей против декора. - Нижний — ось.
GraphicsSettings.transparencySortMode = CustomAxis, ось(0, 1, 0). Он разводит ОДИНАКОВЫЕ группы с одинаковыми настройками слоя — двух одинаковых юнитов рядом, у которых ордер совпадает и по ордеру они неразличимы. Кто ниже по экрану, тот ближе.
Почему: в аудите настроек это выглядело как нарушение принципа единого владельца — один факт, два места. Вердикт Макса 2026-07-30: не спор, а разделение уровней. Ордер отвечает за то, что сравнимо по смыслу; глубина — за то, что по ордеру равно. Убрать ось значило бы оставить порядок между равными юнитами неопределённым, и он «мигал» бы при движении; убрать раздачу ордера — потерять управление тем, что должно быть строго выше или ниже независимо от позиции.
Грабли: у 2D-рендерера URP свой Transparency Sort Mode, и он перекрывает настройку проекта.
У нас Renderer2D.asset стоит в Default и потому ось наследует — но правка этого поля тихо
обесточила бы ось, а тесты на GraphicsSettings остались бы зелёными. Поэтому проверка рендерера
входит в тест отдельным кейсом.
Владелец правды: SpriteSortingSetupTests (инвариант между настройкой проекта и кодом),
ProjectSettings/GraphicsSettings.asset (значение оси), SkeletalBodyVisual (ордер группы).