Извлечено из замороженного 20-explanation/index (карта кода).

Решили: бой считают системы над данными, а не юниты сами себя. Юнит — это POCO в списке; нет MonoBehaviour, который двигает себя в Update.

Почему: игра кооперативная по сети и с паузой. Оба требования упираются в одно: ход боя должен быть предсказуемым и отделённым от рендера. «По-юнитёвому» этого не даёт — порядок обхода Update определяет Unity, он меняется от порядка создания объектов и от сцены, и воспроизводимость теряется вместе с ним. Пауза в такой схеме тоже становится набором флагов на сотне объектов вместо одного не-тикающего цикла.

Есть и цена: юнит-как-объект удобнее читать и отлаживать в редакторе, а список данных требует инструментов. Мы её платим — отсюда SimBench, зеркальные сторожа и трейсы.

Грабли: соблазн возникает не на юните, а на снаряде или эффекте («ну это же просто летящая штука, пусть сама летит в Update»). Один такой объект ломает ровно то же самое, только незаметнее: его движение перестаёт быть частью тика, и зеркальные стороны расходятся не сразу.

Владелец правды: Assets/_Project/Scripts/Combat/ (системы и CombatSimulation); порядок шагов — Journal - Why The Tick Order Is This Order.