Wheel problems

I need a hand with a script i’m using, i keep getting

UnityEngine.Rigidbody.get_velocity () (at C:/BuildAgent/work/d3d49558e4d408f4/artifacts/EditorGenerated/NewDynamics.cs:559)
Wheel.FixedUpdate () (at Assets/Sample Assets/Vehicles/Car/Scripts/Wheel.cs:92)

using UnityEngine;

[RequireComponent(typeof(WheelCollider))]
public class Wheel : MonoBehaviour
{
	public Transform wheelModel;
    public float Rpm { get; private set; }
    public float MaxRpm { get; private set; }
    public float SkidFactor { get; private set; }
    public bool OnGround { get; private set; }
    public Transform Hub { get; set; }
	public WheelCollider wheelCollider { get; private set; }
	public CarController car { get; private set; }
    public Transform skidTrailPrefab;
    public static Transform skidTrailsDetachedParent;
    public float loQualDist = 100;
    public bool steerable = false;
    public bool powered = false;
    [SerializeField]
    private float particleRate = 3;
    [SerializeField]
    private float slideThreshold = 10f;
  
	
	public float suspensionSpringPos { get; private set; }

    private float spinAngle;
    private float particleEmit;
    private float sidewaysStiffness;
    private float forwardStiffness;
    private float spinoutFactor;
    private float sideSlideFactor;
    private float springCompression;
    private ParticleSystem skidSmokeSystem;
    private Rigidbody rb;
    private WheelFrictionCurve sidewaysFriction;
    private WheelFrictionCurve forwardFriction;
    private Transform skidTrail;
    private bool leavingSkidTrail;
    private RaycastHit hit;
    private Vector3 relativeVelocity;
    private float sideSlideFactorTarget;
    private float spinoutFactorTarget;
    private float accelAmount;
    private float burnoutFactor;
    private float burnoutGrip;
    private float spinoutGrip;
    private float sideSlideGrip;
    private float minGrip;
    private float springCompressionGripModifier;
    private float burnoutRpm;
    private float skidFactorTarget;
    private bool ignore;
	private Vector3 originalWheelModelPosition;

    void Start()
    {
		car = transform.parent.GetComponent<CarController>();
		wheelCollider = collider as WheelCollider;
	
		if (wheelModel != null)
		{
			originalWheelModelPosition = wheelModel.localPosition;
			transform.position = wheelModel.position;// - wheelCollider.suspensionDistance*0.5f*transform.up;
		}

        // store initial starting values of wheelCollider
        sidewaysFriction = wheelCollider.sidewaysFriction;
        forwardFriction = wheelCollider.forwardFriction;
        sidewaysStiffness = wheelCollider.sidewaysFriction.stiffness;
        forwardStiffness = wheelCollider.forwardFriction.stiffness;

        // nominal max rpm at Car's top speed (can be more if Car is rolling downhill!)
        MaxRpm = (car.MaxSpeed / (Mathf.PI * wheelCollider.radius * 2)) * 60;

        // get a reference to the particle system for the tire smoke
        skidSmokeSystem = car.GetComponentInChildren<ParticleSystem>();
        rb = wheelCollider.attachedRigidbody;

        if (skidTrailsDetachedParent == null)
        {
            skidTrailsDetachedParent = new GameObject("Skid Trails - Detached").transform;
        }
    }


    // called in sync with the physics system
    void FixedUpdate()
    {

        // calculate if the wheel is sliding sideways
        relativeVelocity = transform.InverseTransformDirection(rb.velocity); <--- here's the problem
        
        // sideways slide is considered at maximum if 10% or more of the wheel's velocity is perpendicular to its forward direction:
        sideSlideFactorTarget = Mathf.Clamp01(Mathf.Abs(relativeVelocity.x * slideThreshold / car.MaxSpeed) * (car.SpeedFactor * .5f + .5f));
        sideSlideFactor = sideSlideFactorTarget > sideSlideFactor ? sideSlideFactorTarget : Mathf.Lerp(sideSlideFactor, sideSlideFactorTarget, Time.deltaTime);

        spinoutFactorTarget = Mathf.Clamp01((rb.angularVelocity.magnitude * Mathf.Rad2Deg * .01f) * (((1 - car.SpeedFactor) * .5f) + .5f));
        spinoutFactorTarget = Mathf.Lerp(0, spinoutFactorTarget, car.SpeedFactor + (powered ? car.AccelInput : 0));
        spinoutFactor = spinoutFactorTarget > spinoutFactor ? spinoutFactorTarget : Mathf.Lerp(spinoutFactor, spinoutFactorTarget, Time.deltaTime);
        
        // calculate if burnout slip should be occuring
        accelAmount = (wheelCollider.motorTorque / car.MaxTorque);
        burnoutFactor = 0;
        if (powered)
        {
            burnoutFactor = (accelAmount - (1 - car.BurnoutTendency)) / (1 - car.BurnoutTendency);
        }

        burnoutGrip = Mathf.Lerp(1, 1 - car.BurnoutSlipEffect, burnoutFactor);
        spinoutGrip = Mathf.Lerp(1, 1 - car.SpinoutSlipEffect, spinoutFactor);
        sideSlideGrip = Mathf.Lerp(1, 1 - car.SideSlideEffect, sideSlideFactor);

        // doing it this way stops the GC alloc
        minGrip = Mathf.Min(burnoutGrip, spinoutGrip);
        minGrip = Mathf.Min(sideSlideGrip, minGrip);

        springCompressionGripModifier = springCompression + 0.6f;
        springCompressionGripModifier *= springCompressionGripModifier;

        sidewaysFriction.stiffness = sidewaysStiffness * minGrip * springCompressionGripModifier;
        forwardFriction.stiffness = forwardStiffness * burnoutGrip * springCompressionGripModifier;

        wheelCollider.sidewaysFriction = sidewaysFriction;
        wheelCollider.forwardFriction = forwardFriction;

        burnoutRpm = (car.MaxSpeed * car.BurnoutTendency / (Mathf.PI * wheelCollider.radius * 2)) * 60;

        Rpm = burnoutRpm > wheelCollider.rpm ? Mathf.Lerp(wheelCollider.rpm, burnoutRpm, burnoutFactor) : wheelCollider.rpm;

        // if the car is on the ground deal with skid trails and ture smoke
        if (OnGround)
        {
            // overall skid factor, for drawing skid particles
            skidFactorTarget = Mathf.Max(burnoutFactor * 2, sideSlideFactor * rb.velocity.magnitude * .05f);
            skidFactorTarget = Mathf.Max(skidFactorTarget, spinoutFactor * rb.velocity.magnitude * .05f);
            skidFactorTarget = Mathf.Clamp01(-.1f + skidFactorTarget * 1.1f);
            SkidFactor = Mathf.MoveTowards(SkidFactor, skidFactorTarget, Time.deltaTime * 2);

            if (skidSmokeSystem != null)
            {
                particleEmit += SkidFactor * Time.deltaTime;
                if (particleEmit > particleRate)
                {
                    particleEmit = 0;
                    skidSmokeSystem.transform.position = transform.position - transform.up * wheelCollider.radius;
                    skidSmokeSystem.Emit(1);
                }
            }
        }


        if (skidTrailPrefab != null)
        {
            if (SkidFactor > 0.5f  OnGround)
            {
                if (!leavingSkidTrail)
                {
                    skidTrail = Instantiate(skidTrailPrefab) as Transform;
                    if (skidTrail != null)
                    {
                        skidTrail.parent = transform;
                        skidTrail.localPosition = -Vector3.up * (wheelCollider.radius - 0.1f);
                    }
                    leavingSkidTrail = true;
                }

            }
            else
            {
                if (leavingSkidTrail)
                {
                    skidTrail.parent = skidTrailsDetachedParent;
                    Destroy(skidTrail.gameObject, 10);
                    leavingSkidTrail = false;
                }
            }
        }

        // *6 converts RPM to Degrees per second (i.e. *360 and /60 )
        spinAngle += Rpm * 6 * Time.deltaTime;


        var distToCamSq = (Camera.main.transform.position - transform.position).sqrMagnitude;

        var checkThisFrame = true;

        if (distToCamSq > loQualDist * loQualDist)
        {
            // far from camera - use infrequent ground detection, once every five frames
            var checkProbability = Mathf.Lerp(1, 0.2f, Mathf.InverseLerp(loQualDist * loQualDist, loQualDist * loQualDist * 4, distToCamSq));
            checkThisFrame = Random.value < checkProbability;
        }

        if (!checkThisFrame)
            return;

        if (Physics.Raycast(transform.position, -transform.up, out hit, wheelCollider.suspensionDistance + wheelCollider.radius))
        {
            suspensionSpringPos = -(hit.distance - wheelCollider.radius);
            springCompression = Mathf.InverseLerp(-wheelCollider.suspensionDistance, wheelCollider.suspensionDistance, suspensionSpringPos);
            OnGround = true;
        }
        else
        {
			suspensionSpringPos = -(wheelCollider.suspensionDistance);
            OnGround = false;
            springCompression = 0;
            SkidFactor = 0;
        }

		// update wheel model position and rotation
		if (wheelModel != null)
		{
			wheelModel.localPosition = originalWheelModelPosition + Vector3.up * suspensionSpringPos;
			wheelModel.localRotation = Quaternion.AngleAxis(wheelCollider.steerAngle, Vector3.up) * Quaternion.Euler(spinAngle, 0, 0);
		}
	}
}

Any help would be great, thanks!

Bump

Dont bump threads after an hour.

Check that the rigidbody is being assigned correctly.

Everything is set, i use a diffrent wheel setup an everything works just fine just no wheel movement, i use this one an this error pops up.

Rigidbody isn’t the problem or the error, line 92 is:

relativeVelocity = transform.InverseTransformDirection(rb.velocity); <— here’s the problem

Yeah I can read code…

Rigidbody is obviously the problem, why its the problem is un-clear.

Put this code about that line

if(rb == null)
 Debug.Log("Despite everything being setup, its not");