2. Задача
Есть домики разных типов.
Можно отправлять войска
из домика в домик — юниты
идут красивыми линеечками.
Есть юниты с разными
характеристиками и разных
рас.
Обманывать игроков нельзя.
Нужно честно рисовать
и синхронизировать по сети.
4. Редактор
Создаем тулзы для
дизайнера уровней.
Важно, чтобы было
возможно редактировать
пути, по которым юниты
будут двигаться, обходя
домики и препятствия.
6. Вариант 1: new GameObject()
● Все видно на сцене;
● Легко кастомизировать;
● Структура юнита:
Back Highlight
Main Sprite
Weapon Sprite
● Тень — это слой, он должен
рисоваться всегда ниже
остальных спрайтов, а значит
необходимо иметь такую же
структуру для слоя с тенями;
● Низкая производительность
при частых обновлениях.
~110 ms
Возможно
изменение порядка
отрисовки
7. Вариант 2: new Mesh()
● Легко кастомизировать
через Wrapper.
● Низкая производительность
при частых обновлениях.
~80 ms
8. Вариант 3: ParticleSystem
● Легко кастомизировать;
● Необходимая
производительность.
● Невозможно задать UV-координаты
для каждой частицы.
~6 ms
9. Вариант 4: Graphics.DrawMesh
● Рисуется внутри Unity Render;
● Работает батчинг.
● Невозможно кастомизировать;
● Низкая производительность
при частых обновлениях.
~28 ms
10. Вариант 5: Graphics.DrawMeshNow
● Невозможно кастомизировать;
● 1 вызов = 1 DrawCall;
● Низкая производительность при
частых обновлениях;
● Рисуется все в PostRender.
~25 ms
11. Вариант 6: GL.Begin(GL.QUADS)
● Можно нарисовать все
в один проход.
● Сложно кастомизировать;
● Низкая производительность
при частых обновлениях;
● Рисуется все в PostRender.
~62 ms
12. Вариант 7: Свой Renderer
● Можно нарисовать все
в один проход;
● Любая кастомизация;
● Необходимая
производительность.
● Рисуется все в PostRender;
● Не поддерживается WebGL;
● Необходимо поддерживать все
платформы (PC/Mac/Linux, iOS,
Android, PS4, XBoxOne) и Graphics
API (OpenGL 2-4, OpenGL ES 2-3,
DirectX 9, DirectX 11).
~6 ms
21. Состояния
Сохраняем состояние игры раз в N тиков.
Буфер состояний циклический, рассчитывается исходя
из максимальной задержки пакетов в сети (timeout).
t
t
Сохраненное состояние игры
22. События
События добавляются всегда только с номером тика.
Таким образом, мы всегда знаем, где это событие
находится или должно находиться. По сути — это RPC.
t
t
t
Выполненные события
24. Откат
Необходимо откатиться в прошлое на ближайшее сохраненное состояние,
полностью восстановив текущее состояние игры на тот момент времени.
t
t
t
Новое событие
29. Итого
● Бесплатно получили реплеи;
● Логика на всех клиентах считается одинаково;
● Сервер не нагружен;
● Минимум трафика;
● Нет никаких лишних синхронизаций;
● Нужно не забывать хранить данные в игровом
состоянии.