Суббота, 09 Ноября 2024, 05:14

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Могут ли 2 collider'а с флагом true в IsTrigger взаимодейс..
killing002Дата: Среда, 01 Апреля 2020, 00:20 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Приветствую.
В ютубе наткнулся на серию уроков по созданию 2.5d платформера. Стало интересно и в итоге наткнулся на одну из его реализаций обнаружения нанесения урона. А именно:
У него на сцене 2 персонажа - player & enemy. Они оба прошли процедуру ragdoll'а , то есть у их костей есть 2 компонента: rigidbody & character joint . После он через скрипт сначала включает флаг IsTrigger у каждого коллайдера на костях, потом к каждой кости (имею ввиду все те кости, которые используются в ragdoll'е) прикрепляет пользовательский скрипт, который описывает 2 метода: OnTriggerEnter() & OnTriggerExit(). В этих методах он и определяет как будет происходить взаимодействие. И в тот момент когда player наносит удар по enemy, видно на видео как удары регистрируются. Вопрос в следующем: Как это возможно?? Ведь в документации ясно сказано, что 2 коллайдера у которых стоят флаги IsTrigger будут всячески игнорироваться движком... Но у этого парня на видео все работает. Я день уже пытаюсь понять как это. Думаю, что в старых версиях юнити это было возможно.. Читал документацию от юнити 2018, и там этого написано не было.. Разъясните, кто тут много знает.. Заранее спасибо.
Ссылки:
1) Тут он перемещает методы OnTriggerEnter() & OnTriggerExit() на каждую кость
https://www.youtube.com/watch?v=5Vx73Ao6RfQ&list=PLWYGofN_jX5BupV2xLjU1HUvujl_yDIN6&index=28
2) Тут он устанавливает ragdoll(если так можно выразиться)
https://www.youtube.com/watch?v=OJFS4Z0tT9A&list=PLWYGofN_jX5BupV2xLjU1HUvujl_yDIN6&index=23

Очень интересно, что за чертовщина творится..


123

Сообщение отредактировал killing002 - Среда, 01 Апреля 2020, 12:21
drcrackДата: Среда, 01 Апреля 2020, 02:24 | Сообщение # 2
старожил
Сейчас нет на сайте
т.к. 2 триггера действительно взаимодействовать не могут, можно предположить что у него есть и другие коллайдеры
поэтому я просто промотал первое видео в конец и обнаружил это:


PS
Цитата
Я день уже пытаюсь понять как это.

это заняло секунд 10 :D


Сообщение отредактировал drcrack - Среда, 01 Апреля 2020, 02:25
killing002Дата: Среда, 01 Апреля 2020, 11:38 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Этот boxcollider не участвует в взаимодействии. В методе OnTriggerEnter(), у него есть условие которое исключает все взаимодействия с этим коллайдером.
Так выглядит код который фиксирует взаимодействия:
Код

    public class TriggerDetector : MonoBehaviour
    {

        private CharacterControl owner;

        private void Awake()
        {
            owner = this.GetComponentInParent<CharacterControl>();
        }

        private void OnTriggerEnter(Collider col)
        {
            
            if (owner.RagdollParts.Contains(col)) // Исключает соприкосновения частей ragdoll'a друг об друга
            {
                return;
            }

            CharacterControl attacker = col.transform.root.GetComponent<CharacterControl>(); // это жертва
            
            if (attacker == null) //Исключает ситуацию, когда жертвы нет
            {
                return;
            }

            if (col.gameObject == attacker.gameObject) // Игнорирует collider на самой верхней иерархии (тот самый boxcollider). Игнорирует свой boxcollider и чужие
            {

                Debug.Log(" I TOUCH " + attacker.transform.root.name + " BIG box collider  " + transform.root.gameObject);
                return;
            }

            if (!owner.CollidingParts.Contains(col)) // Если в этом листе нет этого коллайдера то добавить этот коллайдер.
            {
                owner.CollidingParts.Add(col);
            }
        }

        private void OnTriggerExit(Collider attacker) // При выходе из коллайдеров удалять их
        {
            if (owner.CollidingParts.Contains(attacker))
            {
                owner.CollidingParts.Remove(attacker);
            }
        }
    }

Может поможет кому.. Этот скрипт висит на каждой кости, участвующей в ragdoll'e


123

Сообщение отредактировал killing002 - Среда, 01 Апреля 2020, 12:19
LLLДата: Среда, 01 Апреля 2020, 18:46 | Сообщение # 4
участник
Сейчас нет на сайте
Могут ли 2 collider'а с флагом true в IsTrigger взаимодействовать?

Да легко. Physics.OverlapSphere, например.
И куча еще других вариантов.

Ну а так не, не могут.

Вообще, чем меньше юзаешь физику в скрипте, тем, как не странно, она лучше работает :)
Пример от этого чувака лучше вообще забыть.
killing002Дата: Среда, 01 Апреля 2020, 22:38 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Цитата LLL ()
Пример от этого чувака лучше вообще забыть.

Это был довольно исчерпывающий ответ.


123
OtinagiДата: Пятница, 03 Апреля 2020, 08:13 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Странно. Я тоже раньше видел, что нельзя использовать два триггера, и у меня даже с этим была проблема в одном из прошлых проектов, и вот сейчас с ужасом вспомнил, а не допустил ли я и в текущем проекте два флага триггера. Полез смотреть и действительно - у меня на двух объектах стоят флаги триггеров и всё работает....

У меня есть условный враг и пуля игрока. У врага установлен флаг триггер, а в скрипте обрабатывается OnTriggerEnter2D. Здесь же проверяется столкновение с пулей. На пуле игрока также установлен флаг триггер, а также прикреплён Rigidbody2D. Скрипт отвечает лишь за перемещение пули.

Установлена версия Unity 2019.3.7f1.


«Смерти меньше всего боятся те люди, чья жизнь имеет наибольшую ценность.»
Иммануил Кант
k0feДата: Суббота, 04 Апреля 2020, 02:31 | Сообщение # 7
BRONX
Сейчас нет на сайте
Стоит более внимательно читать документацию. В ней это описывается.

https://docs.unity3d.com/ru/current/Manual/CollidersOverview.html

https://docs.unity3d.com/ru/current/Manual/LayerBasedCollision.html


мой стрим, который я редко включаю, но зато на нём я делаю игры

Сообщение отредактировал k0fe - Воскресенье, 05 Апреля 2020, 22:50
killing002Дата: Вторник, 07 Апреля 2020, 15:46 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Я дважды перечитал данные ссылки и пока ничего. Можно конкретней.. Если вы ведете к тому, что проблема в слоях, то нет.. я все проверил - дело не в этом. Так же в одной их этих ссылок находилась одна очень полезная таблица - "матрица действий коллизии". В ней можно наблюдать, что с чем может взаимодействовать, а что нет. И в ней можно заметить, что Rigidbody Trigger Collider может взаимодействовать с Rigidbody Trigger Collider. В одном месте документации говорится одно, в другом другое, но ровно противоположное.. Либо я тупой, либо да..

123

Сообщение отредактировал killing002 - Вторник, 07 Апреля 2020, 15:50
drcrackДата: Вторник, 07 Апреля 2020, 16:10 | Сообщение # 9
старожил
Сейчас нет на сайте
Перечитал документацию, там говорится что два триггера не могут столкнуться, и ведь это действительно так
Столкновение (Collision, OnCollisionEnter, и тд) и OnTriggerEnter это ведь разные вещи
Так что твой код должен просто работать т.к. никаких столкновений там не происходит (тем более все тела isKinematic)

Цитата
Могут ли 2 collider'а с флагом true в IsTrigger взаимодействовать?
Да легко. Physics.OverlapSphere, например.

И каким же образом 2 коллайдера взаимодействуют друг с другом, когда их накрывает OverlapSphere?


Сообщение отредактировал drcrack - Вторник, 07 Апреля 2020, 16:11
killing002Дата: Вторник, 07 Апреля 2020, 17:31 | Сообщение # 10
почетный гость
Сейчас нет на сайте
Цитата drcrack ()
(тем более все тела isKinematic)

isTrigger вы хотели сказать.. IsKinematic вовсе предотвращает физические взаимодействия(настройка в rigidbody)
Цитата drcrack ()
там говорится что два триггера не могут столкнуться

Понимание по поводу документации начинает приходить. Но это не как не отменяет того факта, что 2 rigidbody Trigger Collider'a не взаимодействуют.
Продолжу поиски.

Добавлено (08 Апреля 2020, 21:05)
---------------------------------------------
Благодарю всех кто участвовал в этом.. 2 trigger collider'a могут взаимодействовать, но только не в unity версии 2019.3.0a10. Перешел на версию 2019.3.0f6 и все начало работать как часы.. Минус неделя времени..


123
LLLДата: Вторник, 14 Апреля 2020, 00:45 | Сообщение # 11
участник
Сейчас нет на сайте
Цитата killing002 ()
Перешел на версию 2019.3.0f6 и все начало работать как часы..


юнитек...

Добавлено (14 Апреля 2020, 00:59)
---------------------------------------------

Цитата drcrack ()
И каким же образом 2 коллайдера взаимодействуют друг с другом, когда их накрывает OverlapSphere?


оверлап сфера тут типа триггер
drcrackДата: Вторник, 14 Апреля 2020, 02:47 | Сообщение # 12
старожил
Сейчас нет на сайте
Цитата
юнитек...

тс зачем-то поставил альфа версию, не обновлял ее, а виноват конечно юнитек
LLLДата: Воскресенье, 26 Июля 2020, 02:15 | Сообщение # 13
участник
Сейчас нет на сайте
Input манагер? Чо, не, не юнитек?
И таких косяков мелких и крупных по всюду.

Добавлено (26 Июля 2020, 02:19)
---------------------------------------------

Цитата drcrack ()
тс зачем-то поставил альфа версию, не обновлял ее, а виноват конечно юнитек


Конечно виноват юнитек. Он не предупредил о версии.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг