I recommend you to keep track of the last 4, 8 or 16 rotations in an array and use Quaternion.Lerp to set the rotation to the average of those 4, 8 or 16 rotations.
Here is an example that smoothes between 16 rotations(which is extreme smoothing):
private List<Quaternion> lastRotations = new List<Quaternion>();
Quaternion quatA = lastRotations[0];
Quaternion quatB = lastRotations[1];
Quaternion quatC = lastRotations[2];
Quaternion quatD = lastRotations[3];
Quaternion quatE = lastRotations[4];
Quaternion quatF = lastRotations[5];
Quaternion quatG = lastRotations[6];
Quaternion quatH = lastRotations[7];
Quaternion quatI = lastRotations[8];
Quaternion quatJ = lastRotations[9];
Quaternion quatK = lastRotations[10];
Quaternion quatL = lastRotations[11];
Quaternion quatM = lastRotations[12];
Quaternion quatN = lastRotations[13];
Quaternion quatO = lastRotations[14];
Quaternion quatP = lastRotations[15];
Quaternion quatAB = Quaternion.Lerp(quatA, quatB, 0.5f);
Quaternion quatCD = Quaternion.Lerp(quatC, quatD, 0.5f);
Quaternion quatEF = Quaternion.Lerp(quatE, quatF, 0.5f);
Quaternion quatGH = Quaternion.Lerp(quatG, quatH, 0.5f);
Quaternion quatIJ = Quaternion.Lerp(quatI, quatJ, 0.5f);
Quaternion quatKL = Quaternion.Lerp(quatK, quatL, 0.5f);
Quaternion quatMN = Quaternion.Lerp(quatM, quatN, 0.5f);
Quaternion quatOP = Quaternion.Lerp(quatO, quatP, 0.5f);
Quaternion quatABCD = Quaternion.Lerp(quatAB, quatCD, 0.5f);
Quaternion quatEFGH = Quaternion.Lerp(quatEF, quatGH, 0.5f);
Quaternion quatIJKL = Quaternion.Lerp(quatIJ, quatKL, 0.5f);
Quaternion quatMNOP = Quaternion.Lerp(quatMN, quatOP, 0.5f);
Quaternion quatABCDEFGH = Quaternion.Lerp(quatABCD, quatEFGH, 0.5f);
Quaternion quatIJKLMNOP = Quaternion.Lerp(quatIJKL, quatMNOP, 0.5f);
Quaternion quatABCDEFGHIJKLMNOP = Quaternion.Lerp(quatABCDEFGH, quatIJKLMNOP, 0.5f);
And apply "quatABCDEFGHIJKLMNOP" to the rotation of your car.
Every frame you receive a new joystick input add it to the list. if the list count is larger than 16, remove the last rotation with lastRotations.RemoveAt(0);
Initialy, fill the list with 16 same rotations(perhaps Quaternion.identity) declaring the initial rotation of your car.
Update:
Complete example with euler angles approach instead of quaternions:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RightJoystickPlayerController : MonoBehaviour
{
public RightJoystick rightJoystick;
public Transform rotationTarget;
private Vector3 rightJoystickInput;
public bool flipRot = true;
public static float angle;
private float horizontal;
private float vertical;
private List<float> lastRotations = new List<float>();
private void Start()
{
for (int i = 0; i < 16; i++)
{
lastRotations.Add(0f);
}
}
private void Update()
{
rightJoystickInput = rightJoystick.GetInputDirection();
horizontal = rightJoystickInput.x;
vertical = rightJoystickInput.y;
angle = Mathf.Atan2(horizontal, vertical) * Mathf.Rad2Deg;
angle = flipRot ? -angle : angle;
lastRotations.Add(angle);
while (lastRotations.Count > 16)
{
lastRotations.RemoveAt(0);
}
float rotA = lastRotations[0];
float rotB = lastRotations[1];
float rotC = lastRotations[2];
float rotD = lastRotations[3];
float rotE = lastRotations[4];
float rotF = lastRotations[5];
float rotG = lastRotations[6];
float rotH = lastRotations[7];
float rotI = lastRotations[8];
float rotJ = lastRotations[9];
float rotK = lastRotations[10];
float rotL = lastRotations[11];
float rotM = lastRotations[12];
float rotN = lastRotations[13];
float rotO = lastRotations[14];
float rotP = lastRotations[15];
float rotAB = Mathf.LerpAngle(rotA, rotB, 0.5f);
float rotCD = Mathf.LerpAngle(rotC, rotD, 0.5f);
float rotEF = Mathf.LerpAngle(rotE, rotF, 0.5f);
float rotGH = Mathf.LerpAngle(rotG, rotH, 0.5f);
float rotIJ = Mathf.LerpAngle(rotI, rotJ, 0.5f);
float rotKL = Mathf.LerpAngle(rotK, rotL, 0.5f);
float rotMN = Mathf.LerpAngle(rotM, rotN, 0.5f);
float rotOP = Mathf.LerpAngle(rotO, rotP, 0.5f);
float rotABCD = Mathf.LerpAngle(rotAB, rotCD, 0.5f);
float rotEFGH = Mathf.LerpAngle(rotEF, rotGH, 0.5f);
float rotIJKL = Mathf.LerpAngle(rotIJ, rotKL, 0.5f);
float rotMNOP = Mathf.LerpAngle(rotMN, rotOP, 0.5f);
float rotABCDEFGH = Mathf.LerpAngle(rotABCD, rotEFGH, 0.5f);
float rotIJKLMNOP = Mathf.LerpAngle(rotIJKL, rotMNOP, 0.5f);
float rotABCDEFGHIJKLMNOP = Mathf.LerpAngle(rotABCDEFGH, rotIJKLMNOP, 0.5f);
rotationTarget.rotation = Quaternion.Euler(new Vector3(0, 0, rotABCDEFGHIJKLMNOP));
}
}