Найти тему

Unity 2D. Ruby's Adventure. Part 4

Прямо сейчас Unity рендерит 60 и более кадров в секунду. Но, представим, что у нас менее мощный компьютер и более "тяжелая" игра. Попробуем смоделировать эту ситуацию и изменим частоту рендеринга, то есть отображения кадров. Делается это просто - нужно всего лишь добавить следующе две строчки в метод Start(). Это заставит Unity рендерить с частотой 10 кадров в секунду.

void Start()
{
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 10;
}

Запустите игру и вы увидите, что перемещение персонажа стало более медленным и дискретным:

Почему так происходит? Если вы посмотрите на свой код , то увидите, что он перемещает Ruby на 0.1 единицу каждый раз, когда Unity вызывает функцию Update , то есть каждый кадр:

position.x = position.x + 0.1f * horizontal;

Если ваша игра работает со скоростью 60 кадров в секунду, то Ruby будет двигаться со скоростью 0.1 * 60 , то есть шесть единиц в секунду.

Но если игра работает со скоростью 10 кадров в секунду, как вы только что написали, то Ruby будет двигаться только 0.1 * 10 , то есть на одну единицу в секунду!

Если у игрока есть очень старый компьютер, который может запускать игру только со скоростью 30 кадров в секунду, а у другого игрока есть компьютер, который может запускать игру со скоростью 120 кадров в секунду, у этих двух игроков будет главный герой, который движется с совершенно разными скоростями. Это усложнит или упростит игру, в зависимости от машины, на которой запущена игра.

Чтобы исправить эту проблему, перемещение нужно задавать не в единицах за кадр (как сейчас), а в единицах в секунду . Для этого вы измените скорость движения, умножив ее на время, необходимое Unity для рендеринга кадра.

Если игра работает со скоростью десять кадров в секунду, каждый кадр будет занимать 0.1 секунды . Если он работает со скоростью 60 кадров в секунду, каждый кадр будет занимать 0.017 секунды . Если вы умножите движение на это значение, то движение будет выражено в секундах и будет абсолютно одинаковым для любого компьютера, что поставит игроков в равные условия:

position.x = position.x + 0.1f * horizontal * Time.deltaTime;
position.y = position.y + 0.1f * vertical * Time.deltaTime;

Запустите игру и проверьте, что перемещение Ruby по скорости стало более более медленным. Это произошло потому, что мы стали умножать наше перемещение на значение Time.deltaTime, которое меньше единицы, поэтому дельта перемещения стала совсем маленькая.

Но если убрать в методе Start() две строки, которые устанавливают частоту рендеринга на 10, и снова запустить игру, то вы увидите, что скорость персонажа не изменилась. Она все такая же медленная!

Теперь нам осталось только увеличить эту скорость перемещения, чтобы для любой частоты рендеринга она была одинаковая, но более быстрая.

Для этого достаточно увеличить выражение 0.1f * horizontal * Time.deltaTime. Чтобы его увеличить достаточно заменить множитель 0.1f на бОльшее число, например 3.0f.

Проверьте скрипт:

Скрипт персонажа
Скрипт персонажа

И убедитесь, что персонаж теперь перемещается с достаточно быстрой скоростью.