Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

411
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda