#unity3d #2d #game-physics #physics
#unity3d #2d #игра-физика #физика
Вопрос:
Моя игра (2D вид сверху вниз) о танке, который стреляет отскакивающими пулями. Эти пули имеют бесконечные отскоки и сохраняют ту же скорость после отскока. Он отлично работает со статическими объектами, однако он не поддерживает ту же скорость с движущимися объектами: пуля может толкать предметы, но будет замедляться, и я не знаю, как убрать замедление.
Вот твит, в котором вы можете видеть, как пули замедляются после касания некоторых объектов: https://twitter.com/TurboDevTeam/status/1350751139508215808?s=20
Редактировать: вот параметры пули :
Комментарии:
1. вы пробовали добавлять материал с 1 упругостью?
2. @Leoverload На пуле есть такой материал. Я также попытался применить этот материал к остальным объектам, но результат был тем же.
3. Как установлены ваши значения трения и сопротивления?
4. @Jox Проверьте, убедитесь, что в материале bullet physics комбинация отказов установлена на максимум, а упругость установлена на 1.
5. @Aboud Я обновил сообщение и добавил материалы по физике
Ответ №1:
Комментарий дерХуго в точку: поскольку машины движутся при ударе, они поглощают часть энергии.
Я установил минимальный пример для демонстрации.
У шара есть a CircleCollider2D
и a Rigidbody2D
с Linear Drag = 0
и материал с Friction = 0
и Bounciness = 1
. У стен есть a BoxCollider2D
и a Rigidbody2D
. Гравитация отключена.
Для первого теста стена Rigidbody2D
установлена на Static
.
Для второго теста стена Rigidbody2D
установлена в Dynamic
, с Mass = 10
и Linear Drag = 1
.
Чтобы в этом случае он всегда подпрыгивал, вы должны самостоятельно запрограммировать упругость. Сначала удалите материал по физике или установите упругость на 0, чтобы убедиться, что физический движок не имитирует ее.
Затем создайте сценарий для маркера:
public class Bullet : MonoBehaviour
{
private Vector2 lastVelocity;
void FixedUpdate()
{
lastVelocity = GetComponent<Rigidbody2D>().velocity;
}
void OnCollisionEnter2D(Collision2D collision)
{
GetComponent<Rigidbody2D>().velocity = Vector2.Reflect(lastVelocity, collision.contacts[0].normal);
}
}
(Пожалуйста, обратите внимание, что вы должны использовать GetComponent
осторожно, возможно, вызывая его только один раз при запуске и сохраняя ссылку, я не делал этого, чтобы сохранить минимальный образец.)
Идея здесь состоит в том, чтобы взять скорость непосредственно перед столкновением и инвертировать ее. Однако, если вы Rigidbody2D
включаете скорость OnCollisionEnter
, это уже обновленное значение. Таким образом, вы должны сохранить значение в FixedUpdate
, так как следующий вызывается только после OnCollisionEnter
метода. Затем вы используете Vector2.Reflect
для отражения входящей скорости нормаль столкновения.
Vector2.Reflect
результаты действительны в 2D:
Комментарии:
1. Это действительно круто, спасибо! Но я попробовал: большую часть времени это работает просто отлично, но я заметил, что если пуля попадает в какие-то углы или маленькие / легкие объекты в моей игре, скорость все равно уменьшается
2. Я добавил gif, чтобы вы могли видеть, что происходит
3. Попробуйте напечатать
lastVelocity
величину everyFixedUpdate
для отладки, она должна быть почти постоянной. Небольшие различия могут возникнуть из-за числовых проблем, я думаю, проверьте, так ли это. Если это так, масштабируйте новую скорость так, чтобы ее величина соответствовала предыдущей, чтобы убедиться, что она остается постоянной.4. Да, это так, магнитуда колеблется от 10 до 4. Большое спасибо, с вашей помощью мне удалось увеличить скорость в fixed update.