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

Unity втыкание стрел в объекты и персонажей

#0
15:55, 9 янв. 2020

Стреляю стрелами в объекты и персонажей и по событию OnCollisionEnter делаю Rigidbody на стреле IsKinematic, а коллайдер isTrigger. Стрела останавливается, но может пролететь персонажа насквозь или застрять внутри -а хотелось бы, чтобы стрелы втыкались неглубоко и торчали с той стороны, с которой прилетели. Типы детекции коллизии пробовал все, ничего не меняется. Логика подсказывает использовать рейкаст, но каким образом? Если на этот вопрос уже был найден ответ, прошу кинуть ссылку сюда.


#1
(Правка: 18:42) 18:03, 9 янв. 2020

> по событию OnCollisionEnter делаю Rigidbody на стреле IsKinematic, а коллайдер isTrigger.
чё-то старнное....
Обычно просто go стрелы добавляют в иерархию go куда попала. И она будет торчать там до конца.

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

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

#2
21:49, 9 янв. 2020

FireFenix
> чё-то старнное....
это во всех ассетах со стрельбой из лука сделано, которые я видел
> Обычно просто go стрелы добавляют в иерархию go куда попала. И она будет
> торчать там до конца.
Я так и делаю, но стрела при этом может как торчать правильно, так и проходить сквозь персонажа, а может и вообще за ним в воздухе висетьFireFenix

FireFenix
>
> приведи плохой и хороший примеры с картинками
bug7 | Unity втыкание стрел в объекты и персонажей
тут 1 стрела воткнулась как надо, 2 застряли в теле на середине, а 2 пролетели сквозь тело перса и висят в воздухе за ним

#3
9:48, 10 янв. 2020

Может это поможет.

#4
11:31, 10 янв. 2020

smartxp
так у меня continuous dynamic итак стоит на стрелах. Или его надо еще и на все хитбоксы в персонаже ставить?

#5
(Правка: 12:25) 12:24, 10 янв. 2020

Llevellyn
> тут 1 стрела воткнулась как надо, 2 застряли в теле на середине, а 2 пролетели сквозь тело перса и висят в воздухе за ним
OnCollisionEnter передаёт параметры пересечения, если точка персечения отличается от положения стрелы, логично, что следует переместить стрелу в точку пересечения или в пространство около неё, а не оставлять там где осталась стрела

#6
15:05, 10 янв. 2020

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

#7
16:12, 10 янв. 2020

FireFenix
точка пересечения может быть где угодно и с чем угодно - например хвост стрелы может пересечься с спиной персонажа, пролетев его насквозь спереди -это не значит, что стрелу нужно втыкать персонажу в спину
Smrdis
этот способ точно не будет работать, потому что тогда стрелы, втыкающиеся нормально, будут висеть в воздухе перед персонажем

В общем я пока делаю на рейкастах - пускаю каждый кадр рейкаст из стрелы вперед, и если он попадает в точку, которая ближе 1м от стрелы, то телепортирую стрелу в эту точку. Это работает почти как надо. Но столкнулся со следующей проблемой - если стрелу запэрентить к объекту, в который она попала, то у нее scale как-то домножается на scale этого объекта, причем она растягивается не по своим осям, а по осям новоиспеченного родителя. На буржуйских форумах нашел только костыли типа вставлять пустой GO с размерами 1,1,1 в объект и пэрентить уже к нему, но хотелось бы менее костыльных решений

#8
17:29, 10 янв. 2020

Llevellyn
> этот способ точно не будет работать, потому что тогда стрелы, втыкающиеся
> нормально, будут висеть в воздухе перед персонажем
Ну, как скажешь. Хотя, в реальных проектах результат выглядел неплохо.

#9
(Правка: 19:50) 19:50, 10 янв. 2020

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

>этот способ точно не будет работать, потому что тогда стрелы, втыкающиеся нормально, будут висеть в воздухе перед персонажем
ну так сделай коллайдеры от середеины, а не от кончика и будет тебе счастье

> но хотелось бы менее костыльных решений

  • не скейлить парента.
  • сохранять трансформы стрелы до присоединия. рассчитать [world to стрела] траснформы так чтобы получились, которые были. применить новые трансформы.
  • #10
    1:28, 11 янв. 2020

    А можно сделать коллайдер вывернутый наизнанку ?
    И пускать рейкаст взад стрелы, типа если он увидел коллайдер значит стрела в теле

    #11
    0:05, 16 янв. 2020

    В общем, после продолжительных танцев с бубном проблема вроде как решилась. Персонаж пролетался стрелой насквозь из-за того, что в его рэгдолле у ригидбодей не стояла галочка "isKinematic". Как это связано - ума не приложу, но видимо как-то связано.
    Коллизии на стрелы работают отвратительно при любом способе их детекции (иногда коллизия происходит, когда стрела уже на метр заглубилась в объект), так что пускаю каждый кадр рейкаст по направлению полета стрелы на 2м вперед, и если он выдает true, то создаю в месте хита пустой ГО, к которому приперенчиваю стрелу, а чтобы стрела торчала из цели, немного заглубившись, от позиции ГО отнимаю половину  transform.forward стрелы

    #12
    (Правка: 0:19) 0:18, 16 янв. 2020

    Llevellyn
    > как это связано - ума не приложу, но видимо как-то связано.
    неужели не сумели списать по уроку?
    заверяем вас что связано это напрямую и на то существуют веские причины

    ПрограммированиеФорумФизика