Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

401
Visualizações
Unity & C# - car going a little bit unsmooth on ramp

I am making a racing game. When the car I made is going up on a ramp, it becomes a bit jittery. Don't think it's the camera issue as the game looks smooth on plain grounds and when going down a ramp. This is the video of the jittery car movement on ramp: https://youtu.be/6YC6SLsokCw

I followed this tutorial:https://www.youtube.com/watch?v=cqATTzJmFDY&list=PLllUqr_Vxwvto-j8J-Fk2XmjQhn2PcwlZ&index=2

I noticed that in this tutorial, the author's final outcome is also a bit jittery on ramps. This is the code:

    {
        sphereRb.transform.parent = null;
    }

    private void Update()
    {
        speedInput = 0;
        if (Input.GetAxis("Vertical") > 0)
        {
            GetInputForMoving(forwardAccel);
        }
        else if (Input.GetAxis("Vertical") < 0)
        {
            GetInputForMoving(reverseAccel);

        }

        turnInput = Input.GetAxis("Horizontal");

        if (grounded)
        {
            Turning();
        }

        SetWheelsRotation();

        transform.position = sphereRb.transform.position;
    }

    


    void GetInputForMoving(float directionAccel)
    {
        speedInput = Input.GetAxis("Vertical") * directionAccel * multiplier;
    }

    void Turning()
    {
        transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles + new Vector3(0f, turnInput * turnStrength * Time.deltaTime, 0f));

    }

    void SetWheelsRotation()
    {
        leftFrontWheel.localRotation = Quaternion.Euler(leftFrontWheel.localRotation.eulerAngles.x, (turnInput * maxWheelTurn) - 180, leftFrontWheel.localRotation.eulerAngles.z);
        rightFrontWheel.localRotation = Quaternion.Euler(rightFrontWheel.localRotation.eulerAngles.x, (turnInput * maxWheelTurn), rightFrontWheel.localRotation.eulerAngles.z);

    }
    private void FixedUpdate()
    {
        grounded = false;
        RaycastHit hit;


        //if hits ground
        if (Physics.Raycast(groundRayPoint.position, -transform.up, out hit, groundRayLength, whatisGround))
        {
            grounded = true;

            transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
        }

        if (grounded)
        {
            Moving();
        }
        else
        {
            Dropping();
        }

        
    }

    void Moving()
    {
        sphereRb.drag = dragOnGround;
        if (Mathf.Abs(speedInput) > 0)
        {
            sphereRb.AddForce(transform.forward * speedInput);
        }
    }

    void Dropping()
    {
        sphereRb.drag = 0.1f;
        sphereRb.AddForce(Vector3.up * -gravityForce * 100);
    }

Please help I am really struggling. Sorry for my English, thanks in advance!

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

The car movement actually looks fine and seems to translate smoothly.

The real issue is the car rotation.

If you look at this line :

transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;

You are telling the car to align its y-axis according to the mesh normal. However, a slope or ramp will never be perfectly curved. Polygons are shaping the slope and the normals between each "part" of the slope change abruptly : this is why the car rotation is so steep along the slope. You can see it in the Scene view by enabling the wireframe shading mode (option available just under the "Scene" tab).

What you can do is interpolate between the current car rotation and the target rotation with something like the code below :

Quaternion toRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;

float angle = Vector3.Angle(transform.up, hit.normal);

transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, angle * Time.fixedDeltaTime * rotateSpeed);

You'll have to tweak the rotation speed until it matches what you feel is OK. Quaternion.RotateTowards will smoothly interpolate between the current rotation and the target rotation at the speed of angle x rotateSpeed degrees per second. There are better ways to do all of these but I hope this will unlock you with what you currently have.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda