Перемещение персонажа

Рейтинг: 2Ответов: 2Опубликовано: 18.04.2015

Учу unity, Пытаюсь создать 2d-игру. В уроках по unity твердые тела (rigidbody) перемещают с помощью rigidbody2d.velocity Вопрос: почему нельзя перемещать с помощью transform.position или transform.Translate? Или перемещать можно, но не нужно?) Хотелось получить ответ на вопрос и дальше продолжать изучение unity.

Ответы

▲ 4

transform.position - это просто текущая позиция, Вы должны рассчитать новую позицию вручную.

transform.Translate() - передвигает объект на заданное расстояние, здесь Вы указываете только расстояние.

И в том, и в другом случае они передвигают сам объект, не принимая в расчет его физическое описание. В результате ломается вообще вся физическая симуляция, так как на следующем вызове FixedUpdate(), где рассчитывается физика, объект окажется вовсе не в той позиции, где это ожидается физическим движком.

rigidbody.velocity - меняет физическое описание объекта. Впрочем, это тоже нарушает физику, хотя и в меньшей степени - объект получит только другую скорость. Часто это терпимо.

rigidbody.AddForce() - это то, что реально нужно использовать для движения rigidbody. К сожалению, это мало где описано, а там есть множество нюансов.

Приведу один из вариантов кода для движения rigidbody, он вычисляет разницу между текущим и желаемым значениями velocity и применяет только эту разницу:

var velocityChange = desiredVelocity - _rigidbody.velocity;
_rigidbody.AddForce (velocityChange, ForceMode.VelocityChange);

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

Еще есть специальный компонент CharacterController. Двигать его нужно при помощи его собственных методов SimpleMove() и Move().

▲ 1

Потому что rigidbody — это объект, для которого подключем физический контроллер, он сам умеет считать столкновения и все такое. Ну то есть можно задавать transform.Translate, но вам все равно прийдется где-то хранить скорость, как-то считать столкновения... Почему бы не оставить это для самого движка?