Извлечено из замороженного
20-explanation/index(карта кода).
Решили: бой считают системы над данными, а не юниты сами себя. Юнит — это POCO в списке; нет
MonoBehaviour, который двигает себя в Update.
Почему: игра кооперативная по сети и с паузой. Оба требования упираются в одно: ход боя
должен быть предсказуемым и отделённым от рендера. «По-юнитёвому» этого не даёт — порядок обхода
Update определяет Unity, он меняется от порядка создания объектов и от сцены, и воспроизводимость
теряется вместе с ним. Пауза в такой схеме тоже становится набором флагов на сотне объектов вместо
одного не-тикающего цикла.
Есть и цена: юнит-как-объект удобнее читать и отлаживать в редакторе, а список данных требует инструментов. Мы её платим — отсюда SimBench, зеркальные сторожа и трейсы.
Грабли: соблазн возникает не на юните, а на снаряде или эффекте («ну это же просто летящая
штука, пусть сама летит в Update»). Один такой объект ломает ровно то же самое, только незаметнее:
его движение перестаёт быть частью тика, и зеркальные стороны расходятся не сразу.
Владелец правды: Assets/_Project/Scripts/Combat/ (системы и CombatSimulation);
порядок шагов — Journal - Why The Tick Order Is This Order.