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

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

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

ответ
ответ
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 ....)

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

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

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