// Initialize the controller and blocks

        protected override void OnInitialize()
        {
            // Declare the number of wheels

            SetNumberOfWheels(4);

            if (wheelFL == null || wheelFR == null || wheelRL == null || wheelRR == null)
            {
                Debug.LogError("Missing VPWheelCollider");
                return;
            }

            // Configure mandatory data per wheel

            ConfigureWheelData(wheelState[0], wheels[0], wheelFL, true);
            ConfigureWheelData(wheelState[1], wheels[1], wheelFR, true);
            ConfigureWheelData(wheelState[2], wheels[2], wheelRL);
            ConfigureWheelData(wheelState[3], wheels[3], wheelRR);

            // Initialize DirectDrive and connect it to the rear wheels via differential

            m_directDrive  = new DirectDrive();
            m_differential = new Differential();
            m_differential.settings.gearRatio = 1.0f;

            Block.Connect(wheels[2], 0, m_differential, 0);
            Block.Connect(wheels[3], 0, m_differential, 1);
            Block.Connect(m_differential, 0, m_directDrive, 0);
        }
        // Convert the input state into torque and brake in the track

        void SendInputToTrack(int input, DirectDrive track, Wheel w0, Wheel w1, Wheel w2, Wheel w3)
        {
            track.maxMotorTorque = trackTorque;
            track.maxRpm         = trackRpm;

            if (input == 0)
            {
                float brakeTorque = trackBrakeTorque * 0.25f;           // 4 wheels per track

                w0.AddBrakeTorque(brakeTorque);
                w1.AddBrakeTorque(brakeTorque);
                w2.AddBrakeTorque(brakeTorque);
                w3.AddBrakeTorque(brakeTorque);
                track.motorInput = 0.0f;
            }
            else
            {
                track.motorInput = Mathf.Sign(input);
            }
        }
        // Initialize the controller and blocks

        protected override void OnInitialize()
        {
            // Declare the number of wheels

            SetNumberOfWheels(8);

            if (LeftTrack0 == null || LeftTrack1 == null || LeftTrack2 == null || LeftTrack3 == null ||
                RightTrack0 == null || RightTrack1 == null || RightTrack2 == null || RightTrack3 == null)
            {
                Debug.LogError("Missing VPWheelCollider");
                return;
            }

            // Configure mandatory data per wheel

            ConfigureWheelData(wheelState[0], wheels[0], LeftTrack0);
            ConfigureWheelData(wheelState[1], wheels[1], LeftTrack1);
            ConfigureWheelData(wheelState[2], wheels[2], LeftTrack2);
            ConfigureWheelData(wheelState[3], wheels[3], LeftTrack3);

            ConfigureWheelData(wheelState[4], wheels[4], RightTrack0);
            ConfigureWheelData(wheelState[5], wheels[5], RightTrack1);
            ConfigureWheelData(wheelState[6], wheels[6], RightTrack2);
            ConfigureWheelData(wheelState[7], wheels[7], RightTrack3);

            // Initialize DirectDrive blocks and conect each one with its track

            m_leftDrive  = new DirectDrive();
            m_rightDrive = new DirectDrive();

            SetupTrackTransmission(m_leftDrive, wheels[0], wheels[1], wheels[2], wheels[3]);
            SetupTrackTransmission(m_rightDrive, wheels[4], wheels[5], wheels[6], wheels[7]);

            // Set up the relaxed criteria for putting the wheels to sleep. This allows half of the
            // wheels to be braked without the vehicle entering in full sleep mode.

            vehicleSleepCriteria = VehicleSleepCriteria.Relaxed;
        }