Как иметь плавное движение прыгающего мяча и прыгать следует прямо, когда он сталкивается с краем любого 2DBoxCollider? - PullRequest
0 голосов
/ 03 мая 2019

Я настраиваю игру, в которой мяч продолжает подпрыгивать, и он движется горизонтально, поэтому, когда он сталкивается с краями любого 2DBoxCollider, его направление прыжка изменяется, и я также хочу иметь плавное движение шара, когда он начинает двигаться по кругу через некоторое время

Это для единства, и я использую Rigidbody и 2DBoxCollider для шара и Edge collider 2D для платформ, где мяч будет подпрыгивать.

void FixedUpdate()
{
    ballPosition = new Vector2(ball.position.x,ball.position.y);
}   

public void MoveLeft()
{
    vector2 dir = new Vector2(ball.position.x - 10000f,ballPosition.y);
    Vector2 newPosition = dir - ballPosition;
    transform.Translate(newPosition.normalized*5*Time.deltaTime);
}

public void MoveRight()
{
    Vector2 dir = new Vector2(ball.position.x + 10000f,ballPosition.y);
    Vector2 newPosition = dir - ballPosition;
    transform.Translate(newPosition.normalized*5*Time.deltaTime);
}

Я просто хочу, чтобы движение мяча было плавным, и отскок должен быть прямым даже enter code here, когда он сталкивается с краями коробочного коллайдера. enter code here

1 Ответ

0 голосов
/ 04 мая 2019

См. 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);
}

Набрано на смартфоне, поэтому никаких гарантий, но я надеюсь, что идея проясняется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...