Войти
UnityФорумПрограммирование

Детектирование попадания в цель холодным оружием

Страницы: 1 2 3 Следующая »
#0
23:27, 10 окт. 2020

Хочу детектить попадание в цель(коллайдер) холодным оружием(например мечом), которое находится в руке у анимированного персонажа. Проблема в том, что меч в руке привязан к кости и каждый кадр анимации как бы телепортируется к своему следующему положению, при этом он может не пересекать физически коллайдер цели, поэтому детектирование, построенное на коллизиях, работает не четко - особенно если персонаж мечом махает быстро, а коллайдеры цели маленькие.
2 | Детектирование попадания в цель холодным оружием

Сейчас я посылаю лайнкаст из конца меча из его предыдущего положения в следующее (в LateUpdate), но это тоже работает не всегда (см. картинку). Есть ли еще какие-то способы задетектить прохождение меча сквозь цель? Тыщу рейкастов из всей поверхности меча посылать не хочу. Помимо собственно факта детекции хотелось бы получить точку первого контакта меча с целью.


#1
(Правка: 23:36) 23:34, 10 окт. 2020

Юнити? А цель сделать больше никак? можно просто триггер коллайдер , а не меш.

рейкасты тут не нужны, есть событие которое надо ловить ... должно быть Rigibody и коллайдер

#2
23:51, 10 окт. 2020

Я бы попробовал наделить меч мешем в виде веера с MeshCollider, который появляется в плоскости удара на один кадр. И ловить попадание с помощью OnCollision или OnTrigger монобеха. Там, вроде бы будут доступны данные о всех столкнувшихся треугольниках (кажется только в OnCollision такое есть). Их просто отсортируете по близости к начальному отрезку луча и получите первую точку попадания.

#3
0:00, 11 окт. 2020


А физику переключить в континьос динамик не надо ?

#4
(Правка: 0:13) 0:11, 11 окт. 2020

kkolyan
> OnCollision
именно
kkolyan
> Их просто отсортируете по близости
не надо, просто получите с геймобъекта коллайдера - некий компонент - и если он есть отреагируйте ...

#5
(Правка: 0:28) 0:11, 11 окт. 2020

endeavour_pr
тогда уж continuous speculative. continuous dynamic игнорирует вращательное движение.

Llevellyn
кстати да, пробовали CCD? speculative, судя по докам, не очень надежен - но попробовать стоит, т.к. это сильно проще чем предложенные выше варианты.

tac
> не надо, просто получите с геймобъекта коллайдера - некий компонент - и если он есть отреагируйте ...
человек хочет получить первую точку контакта. при проверке столкновения с "веером" таких точек почти всегда будет выдано много и не в нужном порядке.

#6
(Правка: 0:42) 0:37, 11 окт. 2020

kkolyan
> при проверке столкновения с "веером" таких точек
откуда там веер? разве что скала или дерево рядом ... единицы ...


вот о чем я говорю,  в коде

    void OnCollisionEnter(Collision myCollision)
    {
      CollisionItem locItem = myCollision.gameObject.GetComponent<CollisionItem>();

      if (locItem != null)
      {
...

CollisionItem - можно помещать лишь на нужные объекты, который говорит уже детально с чем столкнулся

... GetComponent - долго? но по мне это меньшие зло ... и уже точно не в его ситуации

#7
(Правка: 0:50) 0:47, 11 окт. 2020

tac
> откуда там веер?
ты процитировал фрагмент моего сообщения, где я предлагаю коллайдер в форме веера.

#8
(Правка: 0:51) 0:50, 11 окт. 2020

Я бы сделал, как советует kkolyan, при помощи проверки коллайдера.
Добавлю однако личное незначительное наблюдение, что изменение размера коллайдера нагружает систему сильнее, чем его перемещение или переведение в режимы вкл/выкл.

Но еще могу предложить альтернативу - в момент удара мерить расстояние до цели удара и угол, на который отклоняется ее положение от направления удара, если есть соответствие - удар попал.
Это конечно если требования к геймплею позволяют такой метод.

#9
1:22, 11 окт. 2020

tac
> Юнити? А цель сделать больше никак? можно просто триггер коллайдер , а не меш.
у меня итак не меш, а примитивы. Цель сделать больше никак, потому что коллайдеры внутри персонажа

kkolyan
>
> тогда уж continuous speculative. continuous dynamic игнорирует вращательное
> движение.
я на 2017 сижу (из-за не апдейтящихся ассетов), там continuous speculative нету

Kaper
> в момент удара мерить расстояние до цели удара и угол, на который отклоняется
> ее положение от направления удара, если есть соответствие - удар попал.
не выйдет, потому что целей могут быть десятки даже в одной зоне замаха

Kaper
> Я бы сделал, как советует kkolyan, при помощи проверки коллайдера.
мне что-то уже кажется что послать десяток рейкастов (через каждые 5см длины оружия) будет выгоднее

#10
(Правка: 1:28) 1:27, 11 окт. 2020

Llevellyn
> мне что-то уже кажется что послать десяток рейкастов (через каждые 5см длины оружия) будет выгоднее
возможно (но не факт, если веер совсем простой), но вариант с меш коллайдером универсальнее, т.к. может работать с любыми формами траектории и цели. да и по коду/конфигурации проще.

у вас будут размашистые удары по длинной дуге? уже при 90° может быть заметно и придется делать финты, чтобы не упускать доставания в середине такой траектории.

#11
(Правка: 3:54) 3:38, 12 окт. 2020

В общем на RaycastNonAlloc все как-то очень плохо работает. Пытался их посылать и веером, и граблями, но почему то в половине случаев они просто игнорируют коллайдеры, через которые пролетают. Заметил также что это зависит от FPS и Timescale.
Почему-то на Linecast все работает гораздо лучше (хотя далеко от идеала). По идее эти функции же не должны отличаться по сути?

#12
4:21, 12 окт. 2020

Llevellyn
> игнорируют коллайдеры
очень любопытно. я такое встречал пару раз, но в итоге, когда делал визуализацию гизмами и смотрел что происходит степ-бай-степ, обнаруживал что в моем коде ошибка, а Raycast* работает как часы. Он не должен туннелироваться.

#13
(Правка: 7:05) 6:59, 12 окт. 2020

Llevellyn
> мне что-то уже кажется что послать десяток рейкастов (через каждые 5см длины
> оружия) будет выгоднее

...кстати, если игровой процесс относительно плоский, то может вместо нескольких рейкастов можно ограничиться одним сферкастом?

#14
14:34, 12 окт. 2020

kkolyan
так я тоже делал визуализацию гизмами: у меня рейкасты пускаются там же где видны лучи цианового цвета. На картинке видно что лучи зашли в коллайдер ноги, но хита не было ни одного (ни на одном из 10 рейкастов).
notdetect | Детектирование попадания в цель холодным оружием
Если бить персонажа на уровне груди, то меч может пройти сквозь коллайдер правой руки, грудь и остановиться только на коллайдере левой руки.

Kaper
а куда посылать один сферкаст то?

Страницы: 1 2 3 Следующая »
UnityФорумПрограммирование