О статье
Немного разглагольствований о повороте юнита. Информация была взята с хайва, хгма, ну и свои тесты. + еще вот блог драколича интересно почитать, однако конкретно в этом посте не всю инфу нахожу верной.
Что влияет на поворот юнита
В РО (Редакторе объектов) юнита есть 3 нужных нам поля которые в той или иной степени оказывают влияние на поворот юнита, а именно:
- Движение - Скорость поворота (turnRate): скорость поворота юнита;
- Графика - Сдвиг окна (propWin): минимально допустимый угол между поворотом юнита и его целью для начала движения;
- Графика - Положение вставки (orientInterp): режим интерполяции поворота юнита.
Для начала хочу сказать что у юнитов есть Действительный и Визуальный углы поворота.
- Действительный это тот угол поворота который рассчитывается для внутриигровых механик, например когда надо начинать движение юнита или когда можно атаковать/кастовать спел. На него влияют turnRate и propWin;
- Визуальный это тот угол поворота который мы видим на экране. На него влияют turnRate и orientInterp.
Часто эти повороты не совпадают. Повороты вообще не простая штука, например когда юнит поворачивается, он делает это не с постоянной скоростью - он может плавно набирать скорость в начале, и плавно понижать ее под конец.
Для управления углом поворота у нас есть следующие нативки:
native SetUnitFacingTimed takes unit whichUnit, real facingAngle, real duration returns nothing // градусы, секунды
native SetUnitFacing takes unit whichUnit, real facingAngle returns nothing // градусы
native GetUnitFacing takes unit whichUnit returns real // градусы
SetUnitFacingTimed устанавливает действительный и визуальный угол поворота юнита за определенное время (т.е. от текущего угла поворота к указанному, скорость поворота юнита в РО на это никак не влияет). Хочу обратить внимание что действительный угол поворота таки может установиться мгновенно, тогда как скорость визуального угла поворота ограничена движком. Еще есть прикол что временное изменение можно отменить любим приказом который прерывает очередь (типо Stop/Hold).
ЭЭЭЭЭЭксперементы
Пробовал юниту перед тем как отдать приказ двигаться в точку (которая расположена прям за ним, 180 градусов кароч) триггерно установить угол поворота как раз по направлению в ту самую точку (с 0 длительностью). По итогу юнит начинал движение сразу же после отдачи приказа, хотя визуально только начал поворачиваться.
SetUnitFacing то же самое что и SetUnitFacingTimed с длительностью 0.
GetUnitFacing возвращает визуальный угол поворота.
Далее подробней.
Скорость поворота
turnRate, он же Скорость поворота - Характеризует скорость поворота юнита. Влияет как на действительную, так и визуальную скорость поворота.
Часто используются значения 0.4, 0.5, 0.6
Часто используются значения 0.4, 0.5, 0.6
Измеряется в радианах за 0.03 сек (kekw). Напомню что поворот на 180 градусов равен повороту на 3.14 (пи) радиан, т.е. узнать время, нужное для поворота на 180 градусов, можно по формуле:
time = 0.03*pi/turnRate
Отсюда выходит что можно узнать нужную нам скорость поворота, зная время необходимое для поворота на 180 градусов:
turnRate = 0.03*pi/time
Понятно что чем больше будет turnRate тем быстрее юнит будет поворачиваться, однако чем больше значение скорости, тем меньше оно будет ускорять юнита. После значения 1.0 ускорение почти не заметно.
При попытке установить скорость поворота на 0, значение выставится на 0.001 - юнит будет делать полоборота за 94.25 сек.
При попытке установить скорость поворота на 0, значение выставится на 0.001 - юнит будет делать полоборота за 94.25 сек.
Демонстрация, белым текстом указана скорость поворота, зеленым указано время потраченное на поворот 180 градусов.
Время примерное, чем больше скорость тем меньше точность.
Для управления скоростью поворота у нас есть следующие нативки:
native SetUnitTurnSpeed takes unit whichUnit, real newTurnSpeed returns nothing // радианы за 0.03 сек
native GetUnitTurnSpeed takes unit whichUnit returns real // радианы за 0.03 сек
native GetUnitDefaultTurnSpeed takes unit whichUnit returns real // радианы за 0.03 сек
SetUnitTurnSpeed устанавливает текущую скорость поворота юнита.
GetUnitTurnSpeed возвращает текущую скорость поворота юнита.
GetUnitDefaultTurnSpeed возвращает дефолтную скорость поворота юнита из РО.
Сдвиг окна
propWin, он же Сдвиг окна - Бомбезный перевод словосочетания "Propulsion Window". Характеризует минимально допустимый угол между поворотом юнита (действительным, а не визуальным) и его целью для начала движения.
(!) Это влияет только на движение юнита, а не на его атаку или применение заклинаний (как это часто описывают). Минимальный угол когда юнит может начать атаковать/кастовать равен 11.5 градусов (от действительного угла, поэтому нам кажется что Лич может кастовать жопой, ведь визуально он еще не повернулся, хотя в действительности уже повернулся) и захардкожен, его никак не изменить.
Часто используются значения 30, 60
(!) Это влияет только на движение юнита, а не на его атаку или применение заклинаний (как это часто описывают). Минимальный угол когда юнит может начать атаковать/кастовать равен 11.5 градусов (от действительного угла, поэтому нам кажется что Лич может кастовать жопой, ведь визуально он еще не повернулся, хотя в действительности уже повернулся) и захардкожен, его никак не изменить.
Часто используются значения 30, 60
Измеряется в градусах. Устанавливается в диапазоне от 0.01 до 180.
При установке значения на 0, юнит перестает двигаться вовсе, только поворачивается на месте.
Если нужно чтоб юнит начинал движение сразу после отдачи приказа вне зависимости от его угла поворота, нужно установить значение на -1. Значения вне диапазона (0; 180] работают как -1.
При установке значения на 0, юнит перестает двигаться вовсе, только поворачивается на месте.
Если нужно чтоб юнит начинал движение сразу после отдачи приказа вне зависимости от его угла поворота, нужно установить значение на -1. Значения вне диапазона (0; 180] работают как -1.
Хз, может так будет понятнее. Юниту нужно повернуться стоя на месте до отметки в 60 градусов прежде начать движение:
Демонстрация, белым текстом указано окно сдвига, зеленым указано время потраченное на поворот до начала движения.
Опять же, время примерное.
Для управления сдвигом окна у нас есть следующие нативки:
native SetUnitPropWindow takes unit whichUnit, real newPropWindowAngle returns nothing // радианы
native GetUnitPropWindow takes unit whichUnit returns real // градусы
native GetUnitDefaultPropWindow takes unit whichUnit returns real // градусы
SetUnitPropWindow устанавливает текущий сдвиг окна юнита.
GetUnitPropWindow возвращает текущий сдвиг окна юнита.
GetUnitDefaultPropWindow возвращает дефолтный сдвиг окна юнита из РО.
Положение вставки
orientInterp, он же Положение вставки - Не менее бомбезный перевод словосочетания "Orientation Interpolation". Характеризует режим интерполяции поворота юнита (визуального, а не действительного), вообщем это то каким образом будет осуществляться поворот (плавность, резкость, и т.д.).
(!) Нативка GetUnitFacing возвращает именно визульный угол поворота.
(!) Нативка GetUnitFacing возвращает именно визульный угол поворота.
Это что-то вроде выбора режима, может иметь 9 значений (от 0 до 8).
Для наглядности, вот график (0-8):
Как видно, самым быстрым и резким будет поворот при orientInterp=6, а медленным и плавным при orientInterp=8.
У того же Лича этот параметр указан как 3, поэтому кажется что он жопой кастовать может.
У того же Лича этот параметр указан как 3, поэтому кажется что он жопой кастовать может.
Демонстрация, белым текстом указано положение вставки.
Вот они слева направо.
Для управления положением вставки нативок нет.
Итог
Комбинируя разные значения этих полей можно добиться интересных результатов, например:
- Наземный неповоротливый объект. Можно сделать так чтобы он долго и медленно поворачивался на месте прежде чем начать двигаться;
- Воздушный массивный объект. Можно сделать так чтобы он начинал движение сразу после получения приказа, таким образом делая пируэты уже в движении.
Карта-пример идет в комплекте.
Ред. makkad
Ред. Makeba
Как настроить поля атаки, чтобы юнит начал стрелять через например 3 секунды, после того, как он получил приказ и подошёл на дистанцию выстрела?
Ред. MpW