Как столкнуться с объектами с высокой скоростью в 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
- Я не использую гравитацию
Ответы
Ответ 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?
- Кстати: вы используете гравитацию? (Не должно быть проблем просто