См. transform.Translate
Если relativeTo
опущено или установлено на Space.Self
, движение применяется относительно локальных осей преобразования.(Оси x, y и z показаны при выборе объекта в Scene View.) Если relativeTo
равно Space.World
, движение применяется относительно мировой системы координат.
Общая проблемаявляется то, что вы переводите в Space.Self
так в локальной системе координат шара.Так как это RigidBody
может начать вращаться после столкновения → движение по кругу.
Поэтому вам придется использовать
transform.Translate(directionVector * distance, Space.World);
однако обратите внимание, что когда вы используете RigidBody
, вы должны не переводить объект через компонент Transform
, используя, например, Translate
, а вместо этого делать это через компонент RigidBody
, например, используяrigidBody.MovePosition
Перемещает твердое тело в положение.
Используйте Rigidbody.MovePosition для перемещения твердого тела, в соответствии с настройкой интерполяции Rigidbody.
Если на Rigidbody включена интерполяция Rigidbody, вызов Rigidbody.MovePosition приводит к плавному переходу между двумя позициями во всех визуализированных промежуточных кадрах.Это следует использовать, если вы хотите непрерывно перемещать твердое тело в каждом FixedUpdate.
, так как при этом используется физический движок, он быстрее и плавнее в зависимости от ваших физических настроек и настроек интерполяции (см. Также RigidBody.position
.
Кроме того, вычисление направления, которое вы используете, немного странно. Вы должны просто использовать Vector3.right == new Vector3(1, 0, 0)
, что в основном именно то, что ваши более сложные результаты расчета
private RigidBody2D rigidBody2D;
private void Awake()
{
rigidBody2D = GetComponent<RigidBody2D>();
}
public void MoveLeft()
{
rigidBody.MovePosition(transform.position + Vector3.right * -5 * Time.deltaTime);
}
public void MoveRight()
{
rigidBody.MovePosition(transform.position + Vector3.right * 5 * Time.deltaTime);
}
Набрано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идея проясняется