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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
4 года назад
0
Похожие вопросы:

ответ
ответ
Pick every unit in range [250] matching condition [бафф спелла]
Всё что находится внутри данного блока произойдёт столько раз, сколько воинов находится внутри выбранной группы. Обратиться к воину можно через Picked Unit ( GetEnumUnit( ) ). Если Вам нужно добавить событие на смерть именно этих воинов, то прямо здесь внутри блока добавляете их в событие триггера, выбрав их через Picked Unit, или сохраняете их в переменные.

Также можно не сохранять каждого воина, а занести их в отдельную группу. А вместо проверки:
Условие: Dying unit = Aim [Integer A]
проверяете, находится ли воин в группе.
ответ
triggering unit - юнит-инициатор, в зависимости от события триггера
измени переменную triggering unit на matching unit. Неудивительно, что оно срабатывает, там фильтр принимает истину для каждого matching unit
matching unit - работает в фильтре, который отсеивает всех выбранных по условию. если условие вернет истину, значит, добавляет в группу. если не подходит, отсеивает.
picked unit - выбранный юнит

даем героям опыт, которые еще живы. +еще какие-то условия

объяснение (если раскрыть обертку)
вот тут выбирает всех юнитов в группу g с необходимым условием f. Внутри фильтра matching unit (на jass GetFilterUnit)
call GroupEnumUnitsInRect(g,bj_mapInitialPlayableArea ,f)
далее перебираете каждого PickedUnit (GetEnumUnit), и что то делаете с ними
call ForGroup(g,function ....)

2
21
4 года назад
2
Просто к радиусу добавляете самый большой физический размер на карте (500 + maxCollizionSize). Но потом нужно сделать проверку IsUnitInRangeXY(enumUnit, x, y, 500).
Принятый ответ
0
27
4 года назад
Отредактирован MpW
0

не знаю будет работать способ предоставленный на киберфоруме, если что стоит лучше поискать в инете. мб есть вариант получше
у здания обычно там не физ размер, у них это прямоугольная (квадратная) текстура пути. диагональ прямоугольника, а точнее квадрата наверн надо принимать за радиус?
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
как незрячий отмечу, что работает оно с физ размерами, иначе бы аое скиллы в доте против вышек не работали бы никогда вообще
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.