Функция позволяет перемещать юнита без дёрганья, при перемещении идет скольжение вдоль непроходимых участков.
---@param source unit
---@param x real
---@param y real
function SetUnitPositionSmooth(source, x, y)
local last_x = GetUnitX(source)
local last_y = GetUnitY(source)
local bx
local by
SetUnitPosition(source, x, y)
if (RAbsBJ(GetUnitX(source) - x) > 0.5) or (RAbsBJ(GetUnitY(source) - y) > 0.5) then
SetUnitPosition(source, x, last_y)
bx = RAbsBJ(GetUnitX(source) - x) <= 0.5
SetUnitPosition(source, last_x, y)
by = RAbsBJ(GetUnitY(source) - y) <= 0.5
if bx then
SetUnitPosition(source, x, last_y)
elseif by then
SetUnitPosition(source, last_x, y)
else
SetUnitPosition(source, last_x, last_y)
end
end
end
jass версия
function SetUnitPositionSmooth takes unit source, real x, real y returns nothing
local real last_x = GetUnitX(source)
local real last_y = GetUnitY(source)
local boolean bx
local boolean by
call SetUnitPosition(source, x, y)
if (RAbsBJ(GetUnitX(source) - x) > 0.5) or (RAbsBJ(GetUnitY(source) - y) > 0.5) then
call SetUnitPosition(source, x, last_y)
set bx = RAbsBJ(GetUnitX(source) - x) <= 0.5
call SetUnitPosition(source, last_x, y)
set by = RAbsBJ(GetUnitY(source) - y) <= 0.5
if bx then
call SetUnitPosition(source, x, last_y)
elseif by then
call SetUnitPosition(source, last_x, y)
else
call SetUnitPosition(source, last_x, last_y)
endif
endif
endfunction
пример работы можно увидеть тут, примерно с минуты видео
Ред. nazarpunk
Спустя 2 года скажу, что использовал эту штуковину уже в 5 проектах, работает как часы