Физика не работает, когда игра работает на устройстве Unity [закрыто]

У меня есть игра с прыгающим мячом. Мяч подпрыгивает, когда он попадает на землю, и когда он попадает в левую стену, он меняет направление вправо, а когда он попадает в правую стену, он меняет направление влево и продолжает отскакивать. Теперь проблема в том, что иногда физическая система не регистрирует столкновение между мячом и левой /правой стеной, поэтому мяч просто проходит через них и выходит из игры, я понятия не имею, что происходит. Я приложу две картинки, одну из игрового представления и другую из вида сцены. введите описание изображения здесь>> </p>

<p> <img src =

3 голоса | спросил Fahir M 28 AMpTue, 28 Apr 2015 11:40:36 +030040Tuesday 2015, 11:40:36

1 ответ


1

Если вы используете физическое моделирование, не просто изменяйте Transform вашего объекта - это, скорее всего, нарушит физику ( но если вы просто используете коллайдеры в качестве триггеров, это может быть ОК).

Если вы используете физику, вы должны переместить свой шар с помощью AddForce. Но здесь вы можете столкнуться с различными проблемами. Первая проблема заключается в поддержании постоянной скорости. Вы можете указать макс bounciness на физический материал шара, а затем вызвать AddForce только тогда, когда мяч меняет направление движения (вы также можете просто попробовать для изменения уже примененной скорости). Другой вариант - сделать AddForce с помощью ForceMode.VelocityChnage и укажите ему разницу между текущей и желаемой скоростями на каждом кадре. К сожалению, это не реализовано для 2D-физики, но некоторые ребята на форумах Unity создали exetension метод для этого . Существует также более простой способ: вы можете просто AddForce на каждом кадре, но сразу после того, как вы могли бы зажать скорость, используя _rigidbody.velocity = Vecotr2.ClampMagnitude(_rigidbody.velocity, Mathf.Abs(_maxSpeed));. Это, кстати, может немного сломать физику, так как вы напрямую меняете velocity.

Вы также должны позаботиться о глобальных значениях стоимости в Edit->Project Settings->Physics 2D. Но, как вы могли видеть, нет значения Bounce Treshold для 2D-физики (есть для 3D). Это означает, что, когда шар столкнется с коллайдером под очень небольшим углом, он «прилипнет» к коллайдеру, и у вас нет возможности его контролировать - он просто жестко закодирован в физические настройки (эта проблема 100% была в 4.6, не уверен в Unity 5). Поэтому вы должны проверить, что в вашей игре нет такой проблемы.

Появляется другая проблема, когда ваш шар движется слишком быстро. Это в значительной степени похоже на то, что вы получаете прямо сейчас: мяч может проходить через коллайдеры. Физика в Unity вычисляется в FixedUpdated. FixedUpdate вызывается каждые 0,02 секунды (вы можете увидеть и изменить это значение в Edit->Project Settings->Time). Если мяч движется слишком быстро, он может пройти через коллайдер между кадрами, а затем столкновения не будет. Вы можете попытаться настроить Interpolate и Collision Detection настройки вашего Rigidbody2D (то же самое для 3D), но это не помогло бы, если вы переместите свой объект через Transform - физика не может предсказать такое движение. Вы должны двигаться с физикой. Но если изменение этих значений вам не поможет, то у вас есть последний вариант использования raycasting. В Unity wiki есть специальный скрипт под названием DontGoThroughThings , который делает это за вас. Вам только нужно будет преобразовать его в 2D (или найти его где-нибудь, я уверен, что кто-то уже это сделал).

Вы можете попытаться переместить мяч только с помощью Rigidbody2D.velocity. Это может сработать, но не может. Скорость - это физика, это правда, но ее изменение вручную может снова нарушить физические вычисления. Скорее всего, это будет видно, когда мяч ударит по другим движущимся объектам с «нормальной» физикой. Другой проблемой может быть гравитация. Это происходит потому, что при изменении значения вручную вы удаляете силы, которые были применены к объекту, и это будет вести себя неестественно. Поэтому вам нужно попробовать его и посмотреть, работает ли он так, как вы хотите. Вероятность того, что вы не можете пойти с ним.

Управление физикой вручную (путем проверки коллизий вручную в сценариях с использованием позиций и размеров объектов) не является вариантом для игр со многими движущимися объектами (поскольку там действительно много работы), но может быть использовано для простые игры, как арканоид. Ручные столкновения в 2D не так уж трудны, но есть некоторые проблемы для решения. Два самыхВажными являются столкновения с ребрами и столкновения с движущимися объектами.

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

ответил Vladimir 28 PMpTue, 28 Apr 2015 16:26:13 +030026Tuesday 2015, 16:26:13

Похожие вопросы

0
Как называется метод балансировки, который уменьшает добавочную стоимость бонусов? XNA или SlimDX (DirectX 10) для мультитач-симулятора ритм-игр? Мировая разведка? Рассчитайте отскок и трение после проекционной игры и редактора collisionLove2D в двух отдельных программах. Какие методы могут для того, чтобы вращать плиточную структуру? Как получить громкость среды реального мира с помощью микрофона устройства в Unity? Как создать путь для бумеранга? Как визуализировать окно imGui? Что не так с использованием движка физики в платформе 2d? Физика 2D Skier выглядит очень искусственно: как изменить код времени выполнения для разных платформ? Как я могу получить все DontDestroyOnLoad GameObjects? Я хочу использовать API GameJolt, как мне защитить свой закрытый ключ, который есть в моей игре? alpha в Google Play ConsoleMPL 2.0 в перспективе разработки игр и продажи данных с PhysX на специализированном GPUCreate безрисковой сетчатой ​​многоугольной плитки. Что требует Steam m a Сообщение Greenlight? Как присоединиться к двум кубам? SDL2 не устанавливает версию OpenGL? Рассчитывайте ресурсы в режиме реального времени. Сокеты или нет? Машинное обучение для улучшения стратегической игры AICan Я использую шрифты под шрифтом C: \ Windows \ Fonts для текста в моей игре? Что вы называете системой здравоохранения Call-of-Duty? Как создать черепичную триангуляционную сетку delaunay? delaunay triangulation в прямоугольнике с треугольниками, соединяющими противоположные края)? Алгоритм живописера против 3D-рендеринга с Z-буфером при рисовании 2D-спрайтов Эффективное обращение с Entity-Interactions в основанной на плитки WorldHierachical Z-Buffering для отсечения окклюзии. Вы можете записать текущий номер кадра в текстовый файл? Нейронная сеть ai эволюция? Переключение из игры в Arcade на P2 в PhaserCamera следует за игроком, но как остановить движение камеры при перемещении игрока

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132