Решили: сортировка спрайтов на арене держится на двух уровнях, и оба обязательны.

  • Верхний — код. Слой и 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 (ордер группы).