@KGUZ694

Почему подпрыгивает объект Rigidbody?

Всем привет! Я пытаюсь сделать простой раннер. Сделал два отдельных скрипта для персонажа и участка дороги, по которому он движется. Скрипт персонажа двигает его влево, вправо и позволяет прыгать, а скрипт дороги двигает её назад, для создания иллюзии бега. В обоих скриптах движение вызывается с помощью rigidbody. Проблема заключается в том, что, когда начинается игра, персонаж (сейчас, на прототипе, его роль выполняет куб) немного погружается в дорогу и начинает подпрыгивать. Из-за этого каждый раз, когда я нажимаю на пробел, персонаж подпрыгивает на разную высоту. Помогите пожалуйста!!!

Если потребуется, смогу скинуть файл с ассетами. Останется только перетащить в окно иерархии персонажа, дорогу и камеру. Они уже настроены и сразу встанут в нужное положение.

Код управления персонажем:
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Rigidbody playerRb;

    public float turnSpeed = 10,
                 distanceBetweenLines = 1.5f,
                 x = 0,
                 gravityMod = 4,
                 jumpForce = 12;
    public bool isOnGround = true;

    void Start()
    {
        playerRb = GetComponent<Rigidbody>();
        Physics.gravity *= gravityMod;
    }

    void Update()
    {
        // Повороты в стороны
        if (Input.GetKeyDown(KeyCode.A) && x > -distanceBetweenLines)
        {
            x -= distanceBetweenLines;
        }
        else if (Input.GetKeyDown(KeyCode.D) && x < distanceBetweenLines)
        {
            x += distanceBetweenLines;
        }

        // Прыжки
        if (Input.GetKey(KeyCode.Space) && isOnGround)
        {
            playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            isOnGround = false;
        }
    }

    private void FixedUpdate()
    {
        playerRb.MovePosition(new Vector3(Mathf.Lerp(transform.position.x, x, turnSpeed * Time.deltaTime), transform.position.y, transform.position.z));
    }

    void OnCollisionEnter(Collision collision)
    {
        // Проверяем на дороге ли мы
        if (collision.gameObject.CompareTag("Road"))
        {
            isOnGround = true;
        }
    }
}



Код движения дороги:
using UnityEngine;

public class MoveBack : MonoBehaviour
{
    private Rigidbody rb;
    static float speed = 20;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.velocity = (Vector3.back * speed);
    }
}
  • Вопрос задан
  • 382 просмотра
Пригласить эксперта
Ответы на вопрос 1
А почему бы не двигать персонажа вместо дороги?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы