Решили: порядок отрисовки нельзя проверять самодельной offscreen-камерой
(new GameObject + Camera + targetTexture + Camera.Render() в edit mode). Проверка делается
глазами в Scene/Game view на статичном стенде из инстансов префаба вида, либо в play-mode.
Почему: заход 2026-07-30 три раза подряд выдал НЕВЕРНЫЙ вердикт именно из-за такого стенда.
Offscreen-рендер показывал, что части двух юнитов перемешиваются (рука одного поверх торса другого) и
что перестановка ордеров SortingGroup не меняет кадр ни на пиксель — при живом контроле в 30358 px
от сдвига юнита. Из этого был сделан вывод, что SetSortingOrder из UnitView ни на что не влияет.
Проверка Максом на статичном стенде в редакторе опровергла это: сортировка корректна. Четыре
пары (разная Y; одинаковая Y; замах через соседа; вплотную с клинком через торс) — юниты выходят
монолитом, ближний целиком спереди, части не смешиваются. То есть схема из
2026-07-30-two-units-parts-never-interleave
верна, а снятие её в
2026-07-30-sorting-claim-retracted-until-measured-in-play
было вызвано негодным инструментом. Обе записи остаются как история хода; правда — здесь.
Грабли (это и есть ценность записи):
- Offscreen
Camera.Render()в edit mode не воспроизводит сортировку URP 2D. ДобавлениеUniversalAdditionalCameraDataне помогает;transparencySortModeу такой камеры при этом наследуется корректно (CustomAxis (0,1,0)), так что «камера не настроена» — ложное объяснение. - Открытая сцена мешает замеру молча: у начала координат в
CoreSceneстоит юнит, и он попадал в кадр как «третья фигура»; хелсбары влезали в кадр;Renderer.boundsпо НЕАКТИВНЫМ рендерерам увели камеру в шесть раз. Стенд надо ставить далеко в стороне (x = 60) и кадрировать вручную. - Численный критерий «какой канал ярче» врёт на контурах и кромках. Годится только дифференциальный: меняем ОДНО и смотрим, изменился ли кадр целиком, плюс контрольный прогон, который ОБЯЗАН дать разницу.
- Слабый тест хуже отсутствия теста: в первой версии стенда меч «дальнего» проходил выше головы ближнего и ничего не перекрывал, а выглядело как успешная проверка. Пара ставится вплотную, рука опускается, клинок ведётся через торс — иначе проверять нечего.
- Объекты стенда с
HideFlags.DontSaveисчезают при domain reload (любая компиляция, запуск тестов), и стенд приходится ставить заново.
Владелец правды: этот файл (метод проверки), SpriteSortingSetupTests (структурные инварианты),
Scene/Game view (фактический порядок).