персонаж проходит сквозь объекты в unity 3d

Как предотвратить прохождение коллайдеров друг через друга?

у меня возникли проблемы с хранением игровых объектов внутри замкнутого пространства. Когда они достигают края, происходит какое-то мгновенное отталкивание, но затем они проходят прямо сквозь стену.

Я использую Box Collider на игроке и сетчатый коллайдер для стены уровня. У меня возникли проблемы с персонажем игрока (космический корабль), что движение контролируется игроком. И с снарядами, которые ведут огонь и забывают двигаться с постоянной скоростью.

это мой код движения для моего игрока. Он работает в

7 ответов

столкновение с быстро движущимися объектами всегда является проблемой. Хороший способ обеспечить обнаружение всех столкновений-использовать Raycasting вместо того, чтобы полагаться на физическую симуляцию. Это хорошо работает для пуль или небольших объектов, но не даст хороших результатов для больших объектов. http://unity3d.com/support/documentation/ScriptReference/Physics.Raycast.html

псевдо-codeish (у меня нет завершения кода здесь и плохой памяти):

У меня есть прототип пинбола, который также дал мне много проблем в тех же областях. Это все шаги, которые я предпринял, чтобы почти (но еще не полностью) решить эти проблемы:

для быстро движущихся объектов:

установите интерполяцию rigidbody в «интерполяцию» (это не влияет на фактическое моделирование физики, но обновляет рендеринг объекта должным образом-используйте это только для важных объектов с точки зрения рендеринга, таких как игрок или пинбол, но не для снарядов)

установите обнаружение столкновений в непрерывное динамическое

прикрепить скрипт DontGoThroughThings (https://www.auto.tuwien.ac.at/wordpress/?p=260) к вашему объекту. Этот скрипт умело использует решение Raycasting, которое я опубликовал в своем другом ответе, чтобы оттянуть оскорбительные объекты до точек столкновения.

установите минимальное проникновение для штрафа до очень низкого значения. Я установил свой 0.001

установите счетчик итераций решателя в более высокое значение. Я установил свой на 50, но вы, вероятно, можете сделать хорошо с гораздо меньшим.

все, что будет иметь штраф в performace, но это неизбежно. Значения по умолчанию мягки по производительности, но на самом деле не предназначены для правильного моделирования небольших и быстро движущихся объекты.

Как насчет установки обнаружения столкновения rigidbody в непрерывно или Непрерывный Динамический?

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

другие тесты с простыми коллайдерами сетки вышли то же самое.

похоже, что лучший ответ-построить составной коллайдер из простых коллайдеров коробки/сферы.

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

другим решением может быть вычисление координат (например, у вас есть мяч и стена. Мяч попадет в стену. Поэтому вычислите координаты стены и установите процесс удара в соответствии с этими кординатами)

1.) Никогда не используйте сетчатый коллайдер. Используйте комбинацию box и capsule collider.

2.) Проверьте ограничения в RigidBody. Если поставить галочку заморозить позицию X, то она пройдет через объект по оси X. (То же самое для оси y).

старый вопрос, но, возможно, это поможет кому-то.

перейдите в настройки проекта > Время и попробуйте разделить фиксированный шаг времени и максимально допустимый шаг времени на два или четыре.

У меня была проблема, что мой игрок смог протиснуться через отверстия меньше, чем игроки коллайдера, и это решило ее. Это также помогает остановить быстро движущиеся объекты.

Источник

Правильная реализация передвижения персонажа

Почему один обьект проходит сквозь другой хотя у меня есть коллайдеры на обоих обьектах?

Почему мой персонаж во время движения проходит сквозь другой обьект, а потом его откидывает назад?

Как реализовать передвижение персонажа в Unity3d правильно?

Почему так часто используется передвижение через transform.position и почему это неправильно?

Почему мой персонаж движется с разной скоростью если проседает FPS?

Почему двигать персонажа через смену transform.position неправильно?

Как сделать прыжок от пола, но так что бы персонаж не мог бесконечно взлетать

Почему когда платформа движется, персонаж стоящий на платформе остается на месте?

Почему пуля не всегда наносит урон?

Все эти вопросы, фактически, являются одним единым вопросом, который слишком уж часто встречается у начинающих.

Заодно создал тэг unity3d-faq

персонаж проходит сквозь объекты в unity 3d. Смотреть фото персонаж проходит сквозь объекты в unity 3d. Смотреть картинку персонаж проходит сквозь объекты в unity 3d. Картинка про персонаж проходит сквозь объекты в unity 3d. Фото персонаж проходит сквозь объекты в unity 3d

1 ответ 1

Перед прочтением важно знать

Хоть я здесь и разбираю в т.ч. нефизическое движение, я настоятельно рекомендую использовать ФИЗИЧЕСКОЕ движение. И переходить на нефизическое только в исключительных ситуациях.

Я буду использовать здесь 2 термина: «телепортация» и «плавное движение». В моем понимании:

Есть люди у которых мнение отличается.

Учтите, что все что написано ниже упирается в верхние значения терминов, а не эти.

Двигать обьекты в игровых движках можно следующими способами:

используя физический движок (движение обусловленное физической моделью игрового движка)

Движение реализуемое через CharacterController (здесь пока что не рассматривается т.к. новички в его сторону вообще не смотрят, может, позже распишу)

Новички очень часто использую телепортацию на каждом кадре, что есть критически неправильным подходом. Потом на SO появляются кучи клонов вопросов вроде «почему персонажа дергает возле стены?» или «почему он проходит сквозь стену?» или «почему пуля не всегда наносит урон?» и подобные.

Нужно запомнить всего одно правило: Двигать/поворачивать через присвоение transform.position / transform.rotation нельзя. Это порождает проблемы. В любом случае это вам вылезет боком.

Пример правильной реализации движения:

( на примере обьекта-шара )

в отличии от пестрящих дичью форумов, в т.ч. сервисе вопросов/ответов от юнити. Там в таких темах слишком часто пишут ответы те люди, которые понятия не имеют о правильном подходе.

персонаж проходит сквозь объекты в unity 3d. Смотреть фото персонаж проходит сквозь объекты в unity 3d. Смотреть картинку персонаж проходит сквозь объекты в unity 3d. Картинка про персонаж проходит сквозь объекты в unity 3d. Фото персонаж проходит сквозь объекты в unity 3d

Связанные с темой понятия:

Если обьект не обладает физическими свойствами (не имеет RigidBody) эти параметры и методы можно использовать для НЕфизического передвижения.

Например поворот камеры.

Или крутящийся куб на небосводе.

Мы не получим дергающуюся картинку при проседании кадров если сделаем НЕФИЗИЧЕСКОЕ движение правильно:

мы присваиваем в новую позицию:

Про физические свойства движения.

мы разово задаем вектор скачка. Только 1 долю секунды. Но он будет изменятся во времени автоматически равномерно уменьшаясь под силой тяжения. Пока не станет нулевым (верхняя точка прыжка), а потом не пойдет в минус по Y (падение), а потом не упадет на землю и не отскочит от нее (снова плюс по Y ) и так до полной остановки физической скорости обьекта на земле.

Если девайс с игрой сильно загружен, вызов методов Update() / FixedUpdate() тоже может просесть в скорости. И если в физике это учтено и без нас, то сейчас мы делаем НЕ физическое движение и именно по-этому это нужно учитывать добавлением даного множителя.

Но и без использования даного множителя у нас не появится проблем с провалами сквозь стены. Это просто фикс скорости.

Пример простой но хорошей НЕФИЗИЧЕСКОЙ реализации кода движения на примере персонажа.

Если в прошлом примере мы двигали шар, то было допустимо его толкать используя физ.модель. То есть мы использовали AddForce() для этих целей.

персонаж проходит сквозь объекты в unity 3d. Смотреть фото персонаж проходит сквозь объекты в unity 3d. Смотреть картинку персонаж проходит сквозь объекты в unity 3d. Картинка про персонаж проходит сквозь объекты в unity 3d. Фото персонаж проходит сквозь объекты в unity 3d

Давайте актуализируем этот код под даного персонажа. Мы заменим физический толчек обьекта на не-физическое, но ПЛАВНОЕ перемещение обьекта в пространстве:

С этим кодом мы получим такой результат:

персонаж проходит сквозь объекты в unity 3d. Смотреть фото персонаж проходит сквозь объекты в unity 3d. Смотреть картинку персонаж проходит сквозь объекты в unity 3d. Картинка про персонаж проходит сквозь объекты в unity 3d. Фото персонаж проходит сквозь объекты в unity 3d

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

Так же можно добавить анимацию бега на нашего персонажа (ну если бы это был не куб).

Но как же реализация на физике?

Да, можно подобное реализовать и на физике.

Наша прошлая версия скрипта имела несколько недостатков. А именно:

Давайте поместим на наш куб CapsuleCollider (минимальное торможение из-за силы трения) и заблочим в rigidBody rotateX и rotateZ (что б наш персонаж не падал на бок).

А потом нацепим на него вот этот скрипт:

персонаж проходит сквозь объекты в unity 3d. Смотреть фото персонаж проходит сквозь объекты в unity 3d. Смотреть картинку персонаж проходит сквозь объекты в unity 3d. Картинка про персонаж проходит сквозь объекты в unity 3d. Фото персонаж проходит сквозь объекты в unity 3d

Вы видите эту плавность, как будто человек бежит, останавливается, бежит в другую сторону? Красота!

А теперь вернитесь к прошлой гифке и присмотритесь. Движение совсем не такое 🙂 Там как буд-то рукой двигают шахматную фигуру по доске.

Ну и описанные выше баги поведения были пофикшены с такой реализацией.

Можно добавить еще физический материал нашему персонажу и откоректировать его поведение.

Вообще улучшать реализацию можно до бесконечности. Но, думаю, основные проблемы СПОСОБОВ ПЕРЕДВИЖЕНИЯ с которыми вы столкнетесь, я затронул 🙂

Оптимально использовать именно передвижение на базе физики.

Пытайтесь использовать исключительно физическое передвижение.

Реализация нестандартной физики движений.

Одним из моих любимейших примеров нестандартной физики движения является игра Ori and the Blind Forest

Такое перемещение/такие прыжки невозможно сделать на основе стандартной физики. Вероятнее всего, это делалось через физическое перемещение + костыли для получения нужных эфектов которые противоречат стандартной физике.

Сначала разрабатываются концепты движения. Они делаются в любом видеоредакторе с примитивными фигурами. Вот пример (если станет недоступным искать можно по Ori and the blind forest Enemy Concepts ) :

Обратите внимание на то, то здесь прорисовано не только перемещение обьекта, но и его вытягивания/сжатия. Изменения формы во время любого взаимодействия с внешним миром. В т.ч. выстрелы так же влияют на форму. А так же что указываются радиусы опознавания главного героя каждым отдельным врагом.

Костыли для каждого персонажа/врага свои собственные. Это делается что бы каждый из них обладал своей уникальной физикой. Сделать это на общей физике навряд ли возможно.

Движение реализовано «правильно» но предмет все равно пролетает сквозь стену

ДАЖЕ если вы реализовали физическое передвижение вашего персонажа, все равно может случится такое, что просчет CollisionDetect может проходить с ошибками. Такое бывает.

Для таких случаев есть настройки отвечающие за обработку CollisionDetect в настройках самого RigidBody.

персонаж проходит сквозь объекты в unity 3d. Смотреть фото персонаж проходит сквозь объекты в unity 3d. Смотреть картинку персонаж проходит сквозь объекты в unity 3d. Картинка про персонаж проходит сквозь объекты в unity 3d. Фото персонаж проходит сквозь объекты в unity 3d

Желательно такого не делать т.к. это негативно сказывается на производительности. Чем на большем количестве обьектов вы меняете эти настройки, тем более вероятно что вы делаете какую-то дичь, которую делать совсем не нужно. Считайте это спасательным кругом, а не панацеей. А если вы так будете делать, то рано или поздно вы прийдете на SO с вопросом почему игра тормозит, вас попросят показать код и ничего не найдут просто потому, что проблема тормозов не в коде. И намучаетесь вы с оптимизациями ой как сильно.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *