Подтвердить что ты не робот

Как столкнуться с объектами с высокой скоростью в Unity

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

У меня есть Сфера с сферическим коллайдером и Bouncy материалом, а RigidBody с этим параметром (Gravity = false, Interpolate = Interpolate, Collision Detection = Continuous Dynamic)

Также у меня есть 3 стены с Box Collider и Bouncy.

Это мой код для Sphere

function IncreaseBallVelocity() {
rigidbody.velocity *= 1.05;
}

function Awake () {
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse);

InvokeRepeating("IncreaseBallVelocity", 2, 2);
}

В настройках проекта я установил: "Min Penetration For Penalty Force" = 0.001, "Solver Interation Count" = 50

Когда я играю в начале, он отлично работает (он отскакивает), но когда скорость переходит на высокий уровень, Сфера просто проходит через стену.

Кто-нибудь может мне помочь?

Спасибо.

Edited

var hit : RaycastHit;

var mainGameScript : MainGame;

var particles_splash : GameObject;

function Awake () {
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse);

InvokeRepeating("IncreaseBallVelocity", 2, 2);
}

function Update() {
if (rigidbody.SweepTest(transform.forward, hit, 0.5))
    Debug.Log(hit.distance + "mts distance to obstacle");
if(transform.position.y < -3) {
    mainGameScript.GameOver();
    //Application.LoadLevel("Menu");
}
}

function IncreaseBallVelocity() {
rigidbody.velocity *= 1.05;
}

function OnCollisionEnter(collision : Collision) {
Instantiate(particles_splash, transform.position, transform.rotation);
}

EDITED добавлено больше информации

  • Fixed Timestep = 0.02 Максимально допустимый Tir = 0.333
  • Нет никакой разницы между запуском игры в редакторе и на Android.
  • Нет. Он выглядит нормально, когда я устанавливаю 0.01
  • My Paddle - это коллайдер Box без Rigidbody, стены одинаковы.
  • Все в одном слое (когда скорость работает нормально, все работает) значение в PhysicsManager по умолчанию (такое же, как на изображении), кроме "Solver Interation Co..." = 50
  • Нет. Когда я меняю скорость, он пропускает другую стену.
  • Я использую стандартный куб, но я расширяю/уменьшаю его, чтобы он соответствовал моему экрану и другим объектам, когда я расширяю стену больше, чем это нормально. bounce
  • Нет. Простой простой пример проекта из видео http://www.youtube.com/watch?v=edfd1HJmKPY
  • Я не использую гравитацию
4b9b3361

Ответ 1

См:

Вы также можете попробовать изменить фиксированный шаг времени для физики. Чем меньше это значение, тем больше Unity вычисляет физику сцены. Но будьте осторожны, делая это значение слишком маленьким, скажем, <= 0,005, вероятно, приведет к нестабильной игре, особенно на переносном устройстве.

script выше подходит для пуль или небольших объектов. Вы можете вручную принудительно выполнить тесты на столкновение с твердым телом:

public class example : MonoBehaviour {
    public RaycastHit hit;
    void Update() {
        if (rigidbody.SweepTest(transform.forward, out hit, 10))
            Debug.Log(hit.distance + "mts distance to obstacle");

    }
}

Ответ 2

Я думаю, что основная проблема заключается в манипулировании Rigidbody velocity. Я бы постарался решить проблему.

  • Перепроектируйте код, чтобы IncreaseBallVelocity и Rigidbody вызывались внутри FixedUpdate. Убедитесь, что нет других манипуляций с Transform.position.
  • Попробуйте заменить скорость установки непосредственно с помощью AddForce или аналогичных методов, чтобы физический движок имел более высокую вероятность рассчитать все зависимости.
  • Если количество элементов (основной символ игрока...) связано с физическим вычислением, убедитесь, что их код также работает в FixedUpdate.

Еще один момент, на который я наткнулся, - это сетки, которые очень сильно масштабируются. Имея a GameObject со шкалой <= 0,01 или >= 100, безусловно, отрицательно влияет на физический расчет. В соответствии с docs и эта запись форума Unity от одному из гуру следует избегать значений Transform.scale!= 1

Все еще не доволен? ОК, тогда следующий тест начинается с больших скоростей, но без ускорения. На этом этапе мы хотим знать, если сама проблема связана с высокой скоростью или ускорением. Было бы интересно узнать значения скоростей, при которых физический движок начнет терпеть неудачу, - разместите их, чтобы мы могли их сравнить.


РЕДАКТИРОВАТЬ: Еще несколько вещей для исследования
6.7 м/сек не звучит так сильно, что, я думаю, есть особая причина или комбинация причин, почему все идет не так.

  • Является ли ваш максимально допустимый временной интервал достаточно высоким? Для тестирования я предлагаю от 5 до 10x Fixed Timestep. Обратите внимание, что это может привести к снижению частоты кадров, но позже может быть dfixed.
  • Есть ли разница между запуском игры в редакторе и на Android?
  • Вы заметили какие-либо снижения частоты кадров из-за 0.01 FixedTimestep? Это означало бы, что физический движок может оказаться в беде.
  • Может ли быть, что есть статические коллайдеры (объекты с коллайдером, но не Rigidbody), которые перемещаются или управляются иначе? Это приведет к тяжелым перерасчетам в PhysX.
  • Как насчет слоев: все стены на одном слое, соответственно. соответствующие слои настроены соответствующим образом в матрице обнаружения столкновений?
  • Эффект отсутствия отказов всегда происходит на одной стене? Если да, можете ли вы просто скопировать 1-ю стену и поставить ее вместо второй, чтобы увидеть, есть ли что-то не так с этой конкретной стеной.
  • Если не прилагать особых усилий, я бы постарался установить некоторые стандартные кубы в качестве стен, чтобы быть уверенным, что transform.scale не виноват в этом (я сделал действительно плохой опыт с этим).
  • Вы управляете гравитацией или TimeManager.timeScale из script?
  • Кстати: вы используете гравитацию? (Не должно быть проблем просто