Как получить плавные 2D прыжки в Unity? - PullRequest
1 голос
/ 23 апреля 2019

Я хочу, чтобы мой персонаж прыгал, но у меня очень медленное движение. Как будто персонаж телепортируется вверх, а не медленно поднимается У тебя есть идеи? Я использую tilemap и Unity 2019.1.0f2.

Я уже пробовал:

rb.AddForce(Vector2.up * jumpForce), rb.velocity = Vector2.up * jumpForce, rb.MovePosition(new Vector2(transform.position.x, transform.position.y+jumpForce).

Вот мой сценарий движения без ранее упомянутого кода:

public float speed;
public float jumpVelocity;
float timeBtwJumps = 0f;
float startTimeBtwJumps = 0.3f;

Rigidbody2D rb;

private void Awake()
{
    rb = GetComponent<Rigidbody2D>();
}                                  

private void Update()
{
    float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    Vector2 position = new Vector2(transform.position.x, transform.position.y);
    rb.MovePosition(new Vector2(position.x + horizontal, position.y));
}

private void FixedUpdate()
{
    if (Input.GetAxisRaw("Vertical") > 0f && timeBtwJumps <= 0f)
    {
        Jump();
        timeBtwJumps = startTimeBtwJumps;
    }
    else
        timeBtwJumps -= Time.deltaTime;
}

void Jump()
{

}

Все в классе происходит от MonoBehaviour. А вот мои настройки твердого тела и игрока:

Body Type: Dynamic 
Material: None
Simulated: true
Use Auto Mass: false
Mass:1
Linear Drag: 0
Angular Drag: 0.05
Gravity Scale:1
Collision Detection: Discrete
Sleeping Mode: Start Awake
Interpolate: None
Freeze Rotation: z-true

В плеере установлен Box Collider 2D с настройками по умолчанию.

Пожалуйста, помогите. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 23 апреля 2019

, если вы хотите физический прыжок, не используйте MovePosition. MovePosition просто переместит твердое тело в положение, зависящее от настроек интерполяции. Поскольку ваша интерполяция равна нулю, вы получаете «очень медленное движение».

Вместо этого вы должны использовать импульсное усилие . Раньше вы только пробовали ускорение силы. Кроме того, ваше горизонтальное движение также должно меняться в зависимости от приближения силы. Попробуйте это так:

void Jump()
{ 
    rb.AddForce(Vector2.up*jumpVelocity, ForceMode2D.Impulse);
}

Чтобы проверить это, вы должны отключить горизонтальное движение на данный момент. Или вы можете сделать что-то вроде этого:

private void Update()
{
    float horizontal = Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    rb.AddForce(horizontal * Vector2.right);
}

Еще несколько вещей:

-Никогда не проверяйте вход внутри цикла FixedUpdate! Ваша игра может работать со скоростью 100 кадров в секунду, и в зависимости от фиксированного обновления (это называется исправлением, так как Unity пытается сохранить частоту кадров обновления физики), вы можете пропустить нажатие кнопки.

-Если вы используете MovePosition, используйте его только в FixedUpdate.

-Вы, возможно, захотите изменить способ проверки ввода в режиме прыжка, а также проверить, заземлен ли плеер.

- Следует также отметить, что следует избегать использования AddForce для ускорения в обновлении.

0 голосов
/ 16 июля 2019

У меня была эта проблема. Как будто персонаж телепортировался вверх, а не медленно поднимался.

Я решил это, изменив код.

Я использовал этот код: MainBodyRigidBody.velocity = new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;

но я должен использовать MainBodyRigidBody.velocity +=

Я изменяю свой код на:

MainBodyRigidBody.velocity += new Vector3 (Delta_X, 0, Delta_Y) * MovementSpeed * Time.deltaTime;

Я использовал приведенный выше код для моего персонажа Движение, но это стало причиной моей проблемы.

0 голосов
/ 23 апреля 2019

Сначала вам нужно вызвать методы Rigidbody из FixedUpdate, потому что именно здесь вычисляется физика. Во-вторых, умножьте значение вектора на Time.fixedDeltaTime.

Пример:

void FixedUpdate()
    {
        rb.MovePosition(rb.position + position * Time.fixedDeltaTime);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...