I keep getting these 2 errors on a car game im trying to work on.The example project works perfect and i have mine setup exactly as the example except i have 6 wheels and not 4. Ok errors are "*IndexOutOfRangeException: Array index is out of range. PlayerCar_Script.Update () (at Assets/Scripts/Car Control/PlayerCar_Script.js:44)"
Code:
// ----------- CAR TUTORIAL SAMPLE PROJECT, ? Andrew Gotow 2009 -----------------
// Here's the basic car script described in my tutorial at www.gotow.net/andrew/blog.
// A Complete explaination of how this script works can be found at the link above, along
// with detailed instructions on how to write one of your own, and tips on what values to
// assign to the script variables for it to work well for your application.
// Contact me at Maxwelldoggums@Gmail.com for more information.
// These variables allow the script to power the wheels of the car.
var FrontLeftWheel : WheelCollider;
var FrontRightWheel : WheelCollider;
// These variables are for the gears, the array is the list of ratios. The script
// uses the defined gear ratios to determine how much torque to apply to the wheels.
var GearRatio : float[];
var CurrentGear : int = 0;
// These variables are just for applying torque to the wheels and shifting gears.
// using the defined Max and Min Engine RPM, the script can determine what gear the
// car needs to be in.
var EngineTorque : float = 600.0;
var MaxEngineRPM : float = 3000.0;
var MinEngineRPM : float = 1000.0;
private var EngineRPM : float = 0.0;
function Start () {
// I usually alter the center of mass to make the car more stable. I'ts less likely to flip this way.
rigidbody.centerOfMass.y = -1.5;
}
function Update () {
// This is to limith the maximum speed of the car, adjusting the drag probably isn't the best way of doing it,
// but it's easy, and it doesn't interfere with the physics processing.
rigidbody.drag = rigidbody.velocity.magnitude / 250;
// Compute the engine RPM based on the average RPM of the two wheels, then call the shift gear function
EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear];
ShiftGears();
// set the audio pitch to the percentage of RPM to the maximum RPM plus one, this makes the sound play
// up to twice it's pitch, where it will suddenly drop when it switches gears.
audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;
// this line is just to ensure that the pitch does not reach a value higher than is desired.
if ( audio.pitch > 2.0 ) {
audio.pitch = 2.0;
}
// finally, apply the values to the wheels. The torque applied is divided by the current gear, and
// multiplied by the user input variable.
FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
// the steer angle is an arbitrary value multiplied by the user input.
FrontLeftWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
FrontRightWheel.steerAngle = 10 * Input.GetAxis("Horizontal");
}
function ShiftGears() {
// this funciton shifts the gears of the vehcile, it loops through all the gears, checking which will make
// the engine RPM fall within the desired range. The gear is then set to this "appropriate" value.
if ( EngineRPM >= MaxEngineRPM ) {
var AppropriateGear : int = CurrentGear;
for ( var i = 0; i < GearRatio.length; i ++ ) {
if ( FrontLeftWheel.rpm * GearRatio *< MaxEngineRPM ) {*
*AppropriateGear = i;*
*break;*
*}*
*}*
*CurrentGear = AppropriateGear;*
*}*
*if ( EngineRPM <= MinEngineRPM ) {*
*AppropriateGear = CurrentGear;*
*for ( var j = GearRatio.length-1; j >= 0; j -- ) {*
_if ( FrontLeftWheel.rpm * GearRatio[j] > MinEngineRPM ) {_
*AppropriateGear = j;*
*break;*
*}*
*}*
*CurrentGear = AppropriateGear;*
*}*
*}*
*```*
*<p>"transform.position assign attempt for 'Object02' is not valid. Input position is { NaN, NaN, NaN }.*
*UnityEngine.Transform:set_position(Vector3)*
*WheelAlignment_Script:Update() (at Assets/Scripts/Car Control/WheelAlignment_Script.js:21)"</p>*
*<p>Code: </p>*
*```*
*// Define the variables used in the script, the Corresponding collider is the wheel collider at the position of*
*// the visible wheel, the slip prefab is the prefab instantiated when the wheels slide, the rotation value is the*
*// value used to rotate the wheel around it's axel.*
*var CorrespondingCollider : WheelCollider;*
*var SlipPrefab : GameObject;*
*private var RotationValue : float = 0.0;*
*function Update () {*
*// define a hit point for the raycast collision*
*var hit : RaycastHit;*
*// Find the collider's center point, you need to do this because the center of the collider might not actually be*
*// the real position if the transform's off.*
*var ColliderCenterPoint : Vector3 = CorrespondingCollider.transform.TransformPoint( CorrespondingCollider.center );*
*// now cast a ray out from the wheel collider's center the distance of the suspension, if it hit something, then use the "hit"*
*// variable's data to find where the wheel hit, if it didn't, then se tthe wheel to be fully extended along the suspension.*
*if ( Physics.Raycast( ColliderCenterPoint, -CorrespondingCollider.transform.up, hit, CorrespondingCollider.suspensionDistance + CorrespondingCollider.radius ) ) {*
_transform.position = hit.point + (CorrespondingCollider.transform.up * CorrespondingCollider.radius);_
*}else{*
_transform.position = ColliderCenterPoint - (CorrespondingCollider.transform.up * CorrespondingCollider.suspensionDistance);_
*}*
*// now set the wheel rotation to the rotation of the collider combined with a new rotation value. This new value*
*// is the rotation around the axle, and the rotation from steering input.*
_transform.rotation = CorrespondingCollider.transform.rotation * Quaternion.Euler( RotationValue, CorrespondingCollider.steerAngle, 0 );_
*// increase the rotation value by the rotation speed (in degrees per second)*
_RotationValue += CorrespondingCollider.rpm * ( 360/60 ) * Time.deltaTime;_
*// define a wheelhit object, this stores all of the data from the wheel collider and will allow us to determine*
*// the slip of the tire.*
*var CorrespondingGroundHit : WheelHit;*
*CorrespondingCollider.GetGroundHit( CorrespondingGroundHit );*
*// if the slip of the tire is greater than 2.0, and the slip prefab exists, create an instance of it on the ground at*
*// a zero rotation.*
*if ( Mathf.Abs( CorrespondingGroundHit.sidewaysSlip ) > 2.0 ) {*
*if ( SlipPrefab ) {*
*Instantiate( SlipPrefab, CorrespondingGroundHit.point, Quaternion.identity );*
*}*
*}*
*}*
*```*