Добавлен
как я заметил при функции pick every unit к примеру с радиусом 500, в радиус функции попадают юнит чей физический центр был задет этим радиусом, а не окружность физ. размера юнита. Итак вопрос как задеть этой функцией ОКРУЖНОСТЬ юнита а не его центр? к примеру если нужно пикнуть здание или большого юнита с широким радиусом

Принятый ответ

Просто к радиусу добавляете самый большой физический размер на карте (500 + maxCollizionSize). Но потом нужно сделать проверку IsUnitInRangeXY(enumUnit, x, y, 500).
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
4 года назад
0
Просто добавить к кругу выбора средний размер юнитов., к примеру 32
0
26
4 года назад
Отредактирован Extremator
0
Вообще делается всё через повторную фильтрацию юнитов уже после отбора подходящих целей, при этом нужно брать юнитов в чуть большем радиусе чем нужно (потому что есть косяк с которым ты как раз и столкнулся), например +75 лишних будет достаточно.
С уже отфильтрованными юнитами (без трупов, без зданий, врагов/друзей, невидимых, и прочих) нужно провести пересчёт дистанции от центра области (точка, вокруг которой выбирались юниты) до реального местоположения юнитов, которое будет получаться за счёт изменения их действительных координат в зависимости от их физ.размера.
Тут ещё такой момент, если чуть-чуть увеличить сравниваемую дистанцию, то тогда можно имитировать что отлов происходит не за счёт попадания "подножья" юнита в нужный круг (область поиска), а за счёт заступления одного круга в другой (область выбора в коллюзию юнита).
А вот для определения физ.размера юнита тебе придётся воспользоваться либо филдом, коих сейчас там навалом (хотя наверно как обычно - нужного как раз нет, и не будет). Но это если у тебя не 1.26, а если он самый - то наверно либо БД пилить на размеры и типы юнитов (хотя будет ли оно тут уместно, получать простое число за счёт перебора огромного списка), либо маркеровать юнита через РО (а тут уже либо ascii юнитов подгонять, либо абилки-пустышки выдавать).

*Ну а теперь немножко лично от себя:
Добавить лишние 32 к радиусу выбора - да, можно. Это на много проще чем вообще что либо делать. Это хорошо прокатывает на областях выбора 300-600. Чем больше - тем лучше, хотя разницы уже и не заметишь. А если область небольшая? всего 120-150, вот тут начинается трешачок. Можно сказать что такие числа никто не использует. Да, можно. Но их всё равно кто-то да использует. У меня вот есть голем, который бросаем небольшой камень в указанную область, что бы задеть буквально пару-тройку стоящих рядом врагов. И вот эта область как раз 150. Сказать что это просто дичь в игре - ничего не сказать. Выбираешь область, летит снаряд, падает, выбираются юниты, наносится урон. При этом кого-то явно не зацепило, а должно было. И наоборот - попало тому кто был в стороне. Казалось бы, может где-то сам накосячил, и выбор идёт со смещением - нет, отрисовка области ясно это показывает. И именно в таких ситуациях эти +32 или хотя бы +16 вообще никак не помогают, а лишь вносят больше сумбура в происходящее.
0
17
4 года назад
Отредактирован GetLocalPlayer
0
А вот для определения физ.размера юнита тебе придётся воспользоваться либо филдом, коих сейчас там навалом (хотя наверно как обычно - нужного как раз нет, и не будет).
Если ты про последний патч, то
BlzGetUnitCollisionSize
Но это если у тебя не 1.26, а если он самый - то наверно либо БД пилить на размеры и типы юнитов (хотя будет ли оно тут уместно, получать простое число за счёт перебора огромного списка), либо маркеровать юнита через РО (а тут уже либо ascii юнитов подгонять, либо абилки-пустышки выдавать).
Первый комментатор дал имя нужной функции
IsUnitInRangeXY
Она учитывает физический размер юнита.
2
26
4 года назад
2
GetLocalPlayer:
IsUnitInRangeXY
Она учитывает физический размер юнита.
Ну, если учитывает всё-таки, тогда да.
Можно её первой в фильтре ставить и закончить на этом.
Но вот если нет...
0
26
4 года назад
Отредактирован Extremator
0
GetLocalPlayer:
IsUnitInRangeXY
Она учитывает физический размер юнита.
Нет, всё-таки она не с работает с физ.размерами юнитов.
Для незрячих поясню: Один юнит явно находится в круге, но проверка показывает что юнит в безопасности (зелёный). Другой юнит явно находится вне круга, но проверка показывает что юнит в опасности (красный).
0
16
4 года назад
0
как незрячий отмечу, что работает оно с физ размерами, иначе бы аое скиллы в доте против вышек не работали бы никогда вообще
1
17
4 года назад
Отредактирован GetLocalPlayer
1
Нет, всё-таки она не с работает с физ.размерами юнитов.
Вот более надежный способ проверки
Если способность действует по области, то ее круг выделения всегда учитывает физический размер юнита. Можешь заметить, что достаточно коснуться краешком области действия способности юнита, как тот тут же выделяется зеленым. Здесь видно, проверка IsUnitInRangeXY соответствует физическому выделению юнита способностью.
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.