Engine animation curve

Hello, i’m making a racing game with only EVs, right now, I have the torque in a float value. But i want to use a animation curve in which the torque will evoluate according to the engine RPM (like you get 700 pound/feet of torque from 0 to 1000 rpm but from 1000 to 2000 it drops to 400 pound/feet of torque).
So the torque is on the vertical axis and the rpm is on the horizontal axis.
PS : i also need a simple way to calculate the wheel rpm.
There is the script :

using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;

public enum Axel
{
    front,
    rear
}

[Serializable]
public struct Wheel
{
    public GameObject model;
    public WheelCollider collider;
    public Axel axel;
}

[RequireComponent (typeof(InputManager))]
public class CarController : MonoBehaviour
{
    public InputManager inputManager;
    public List<Wheel> wheels;
    public Rigidbody localRigidbody;

    [Header("Throttle system")]
    public float torque;
    public float torqueMultiplier = 1;
    public float finalTorque;
    public float level = 1;
    public float currentSpeed;
    public float topSpeed;

    [Header("Steering system")]
    public float maxSteerAngle = 20;
    public float responsiveness = 1;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        finalTorque = torque * torqueMultiplier;
        currentSpeed = localRigidbody.velocity.sqrMagnitude;

        ThrottleSystem();
        SteeringSystem();
        AnimateWheels();
    }

    void ThrottleSystem()
    {
        foreach(var wheel in wheels)
        {
            if (currentSpeed > topSpeed)
            {
                wheel.collider.motorTorque = 0;
            }
            else if (currentSpeed < topSpeed)
            {
                wheel.collider.motorTorque = ((inputManager.throttle * finalTorque) * level) / 4;
            }
        }
    }

    void SteeringSystem()
    {
        foreach (var wheel in wheels)
        {
            if (wheel.axel == Axel.front)
            {
                wheel.collider.steerAngle = inputManager.steer * maxSteerAngle * responsiveness;
            }
            else
            {
                wheel.collider.steerAngle = 0;
            }
        }
    }

    void AnimateWheels()
    {
        foreach (var wheel in wheels)
        {
            Vector3 wheelColliderPosition;
            Quaternion WheelColliderRotation;
            wheel.collider.GetWorldPose(out wheelColliderPosition, out WheelColliderRotation);
            wheel.model.transform.position = wheelColliderPosition;
            wheel.model.transform.rotation = WheelColliderRotation;
        }
    }
}

1 Answer

1

Is a simple way to calculate wheel rpm in your case

wheel.collider.rpm