Добавил призрака лучшего времени, чтобы было проще побить рекорд в таблице лидеров
Как делал
Сразу решил, что записывать каждый кадр движение игрока излишне (может быть 120 кадров в секунду, а может быть и 240 - зависит от настроек игры и устройства игрока). Буду записывать каждые 0.1 секунду новый кадр (итого 10 кадров в секунду) = неплохая оптимизация.
Сделал отдельные копии машин для игрока, в которых меньше "лишних" объектов. Только необходимые части машины для повтора призрака и прозрачный материал
Сам материал супер простой, Unlit шейдер, с Transparent отрисовкой:
Также через расстояние между машиной игрока и призраком уменьшаю альфу материала призрака немного, чтобы сильно не мешал игроку (через скрипт меняю альфу).
Немного кода по записи и чтению кадров
Данные
Создал класс для записи кадров в файл PlayerGhostFrameData.cs:
В Time записываю игровое время уровня, которое было на момент создания структуры. Это пригодится для поиска нужного кадра для синхронизации с игровым временем и создания интерполяции позиций и поворотов между соседними кадрами (плавное движения призрака).
А SkipInterpolation в структуре кадра нужен, чтобы прервать интерполяцию между этим кадром и следующим (в моей игре машина может за 1 кадр телепортировался в другую точку). Иначе машина за 0.1сек летела к новой точке.
Работа с данными
Сделал отдельный менеджер PlayerGhostManager.cs, он хранит ссылку на игрока и записывает кадры + воспроизводит призрака лучшего времени. Сохраняет лучшее время в файл и читает его перед началом уровня (если существует).
В Update менеджера уровня вызываю менеджер призрака, передаю ему gameplayTimer (игровое время уровня):
Сохраняется 10 кадров в секунду (0.1 задержка между кадрами), что достаточно мало - движение призрака будет дерганным. Но при помощи интерполяции кадров я смогу сделать движение плавным. Идея простая: нужно искать 2 ближайших кадра к текущему игровому времени и считать прогресс между кадрами (мы знаем Time каждого):
Поиск нужных кадров
Считал из файла список кадров, которые записал уже с помощью менеджера (переменная _bestFrames), работа с ними:
В целом все.
Делаю это для моей игры Wheel Balance в Steam. Игра уже вышла, доступна демо, также заходите на мой ТГ, если хотите следить за разработкой.
Надеюсь этот материал будет кому-то полезен!